转换特殊字符(UTF-8)
Posted
技术标签:
【中文标题】转换特殊字符(UTF-8)【英文标题】:Convert special characters(UTF-8) 【发布时间】: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,并确定输出端的内容是否正确。
【参考方案1】:
您必须将终端字符编码设置为 ISO8859-1。在我的 Linux 的 Mate 终端中是:
终端 >> 设置字符编码 >> 中欧 (WINDOWS-1250)
然后我能够从您的程序中看到正确的输出。没有这个改变,它确实是一个垃圾。
【讨论】:
不。在gbk_str
变量中,"àèìä"
都在代码页 1252
(US & Western Eu)中定义,而只有 ä
在代码页 1250
(Central欧洲)。以上是关于转换特殊字符(UTF-8)的主要内容,如果未能解决你的问题,请参考以下文章