我想將字符串從GBK字符集轉換爲ISO-8859-1。使用iconv在C/C++中將字符串轉換爲ISO-8859-1
我曾嘗試使用的iconv庫,但iconv()
總是返回-1,並errno
解碼爲「無效或不完整的多字節字符或寬字符」。
我該如何做到這一點?
我想將字符串從GBK字符集轉換爲ISO-8859-1。使用iconv在C/C++中將字符串轉換爲ISO-8859-1
我曾嘗試使用的iconv庫,但iconv()
總是返回-1,並errno
解碼爲「無效或不完整的多字節字符或寬字符」。
我該如何做到這一點?
如果你已經打開了轉換描述不//TRANSLIT
或//IGNORE
,然後iconv()
會返回一個錯誤,當輸入的字符不能在目標字符集表示。由於ISO-8859-1不能代表大多數GBK字符,所以可能發生了這種情況。下面的例子爲我工作:
#include <stdio.h>
#include <string.h>
#include <iconv.h>
int main()
{
char *gbk_str = "GBK \xB5\xE7\xCA\xD3\xBB\xFA";
char dest_str[100];
char *out = dest_str;
size_t inbytes = strlen(gbk_str);
size_t outbytes = sizeof dest_str;
iconv_t conv = iconv_open("ISO-8859-1//TRANSLIT", "GBK");
if (conv == (iconv_t)-1) {
perror("iconv_open");
return 1;
}
if (iconv(conv, &gbk_str, &inbytes, &out, &outbytes) == (size_t)-1) {
perror("iconv");
return 1;
}
dest_str[sizeof dest_str - outbytes] = 0;
puts(dest_str);
return 0;
}
(我希望GBK字符串不是淫穢的,我不知道這意味着什麼!)
你能後,可以重現一零二零年線計劃這個問題? – sarnold
這些字符串是否包含非ASCII(例如中文)字符?這可能是轉換例程無法轉換它們的原因。 –
是的,字符串包含非ASCII字符。 – maixl