转换特殊字符(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 &gt; Advanced Save Options,您可以选择正确的编码,这解决了我的问题 您需要查看实际字节数,以确定输入端的内容是否真的是 UTF-8,并确定输出端的内容是否正确。 【参考方案1】:

您必须将终端字符编码设置为 ISO8859-1。在我的 Linux 的 Mate 终端中是:

终端 >> 设置字符编码 >> 中欧 (WINDOWS-1250)

然后我能够从您的程序中看到正确的输出。没有这个改变,它确实是一个垃圾。

【讨论】:

不。在gbk_str 变量中,"àèìä" 都在代码页 1252US & Western Eu)中定义,而只有 ä 在代码页 1250Central欧洲)。

以上是关于转换特殊字符(UTF-8)的主要内容,如果未能解决你的问题,请参考以下文章

将特殊字符转换为 HTML 字符代码

http请求特殊字符转码

使用 XSLT 转换 xml 中的特殊字符

特殊 ä ö 字符打破 UTF-8 编码

处理 C 中的特殊字符(UTF-8 编码)

XML 属性值中 转换 特殊字符