【发布时间】:2020-07-09 09:13:12
【问题描述】:
我正在尝试用#include <iconv.h> 转换字符à,但我收到垃圾...。
这是代码
#include <stdio.h>
#include <string.h>
#include <iconv.h>
#include <iostream>
int main()
{
char *gbk_str = "àèì asdsa sd aä";
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("ISO8859-1", "UTF-8");
if (conv == (iconv_t)-1) {
std::cout <<"iconv_open";
return 1;
}
if (iconv(conv, &gbk_str, &inbytes, &out, &outbytes) == (size_t)-1) {
std::cout << "iconv";
return 1;
}
dest_str[sizeof dest_str - outbytes] = 0;
puts(dest_str);
return 0;
}
回来:
意大利语字符:POLS 6000 Impianto riduzione d。速度
字节编码:50 4f 4c 53 20 36 30 30 30 20 49 6d 70 69 61 6e 74 6f 20 72 69 64 75 7a 69 6f 6e 65 20 64 2e 20 76 65 6c 6f63 69 74 ca3 >
已转换:POLS 6000 Impianto riduzione d。速度 -> POLS 6000 Impianto riduzione d。速度340
【问题讨论】:
-
很可能是因为您的输入字符串一开始就没有存储在 UTF-8 中。字符串文字使用 UTF-8 不是 C++ 的要求。
-
你应该写下每个字符的值,之前和之后。这将有助于找到问题所在
-
您在使用 Visual Studio 吗?在那种情况下
File > Advanced Save Options,您可以选择正确的编码,这解决了我的问题 -
您需要查看实际字节数,以确定输入端的内容是否真的是 UTF-8,并确定输出端的内容是否正确。