如何在c ++中将utf-8转换为ASCII?

Sur*_*uri 8 c++

我收到服务器在utf-8的响应,但无法读取.如何在c ++中将utf-8转换为ASCII?

Art*_*ius 23

首先请注意,ASCII是7位格式.有8位编码,如果您使用其中一种(例如ISO 8859-1),则需要更具体.

要将ASCII字符串转换为UTF-8,请不执行任何操作:它们是相同的.因此,如果您的UTF-8字符串由ASCII字符组成,那么它已经是ASCII字符串,并且不需要转换.

如果UTF-8字符串包含非ASCII字符(任何带重音或非拉丁字符的字符),则无法将其转换为ASCII.(您也许可以将其转换为ISO编码之一.)

有一些方法可以从拉丁字符中去除重音符号,以便在ASCII中获得至少一些相似之处.或者,如果您只想删除非ASCII字符,只需从utf-8字符串中删除值> = 128的所有字节.


Aoi*_*asu 10

此示例适用于Windows(您未提及目标操作系统):

    // The sample buffer contains "©ha®a©te®s" in UTF-8
    unsigned char buffer[15] = { 0xc2, 0xa9, 0x68, 0x61, 0xc2, 0xae, 0x61, 0xc2, 0xa9, 0x74, 0x65, 0xc2, 0xae, 0x73, 0x00 };
    // utf8 is the pointer to your UTF-8 string
    char* utf8 = (char*)buffer;
    // convert multibyte UTF-8 to wide string UTF-16
    int length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)utf8, -1, NULL, 0);
    if (length > 0)
    {
        wchar_t* wide = new wchar_t[length];
        MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)utf8, -1, wide, length);

        // convert it to ANSI, use setlocale() to set your locale, if not set
        size_t convertedChars = 0;
        char* ansi = new char[length];
        wcstombs_s(&convertedChars, ansi, length, wide, _TRUNCATE);
    }
Run Code Online (Sandbox Code Playgroud)

记住delete[] wide;和/或ansi不再需要时.由于这是unicode,我建议坚持使用wchar_t*,char*除非您确定输入缓冲区包含属于同一ANSI子集的字符.


Jör*_*tag 5

如果字符串包含ASCII中不存在的字符,则无法执行任何操作,因为这些字符在ASCII中不存在.

如果字符串中包含唯一的字符在ASCII存在,那么就没有什么,你需要做的,因为该字符串是已经在ASCII编码:UTF-8是专为与ASCII向后兼容以这样的方式,任何ASCII格式的字符在UTF-8中与ASCII格式完全相同,并且任何不在 ASCII格式的字符都不能具有有效ASCII的编码,即在ASCII格式中始终具有非法编码(具体而言,任何非ASCII字符都将被编码为2-4个八位字节的序列,所有这些字符串的最高有效位设置,即整数值> 127).

您可以尝试音译字符串,而不是简单地尝试转换字符串.这个星球上的大多数语言都有某种形式的ASCII音译方案,至少可以使文本在某种程度上易于理解.例如,我的名字是"Jörg",其ASCII音译将是"Joerg".Ruby编程语言的创建者名称是"まつもとゆきひろ",其ASCII音译将是"Matsumoto Yukihiro".但请注意,您丢失信息.例如,德语sz-ligature被音译为"ss",因此单词"Maße"(测量)被音译为"Masse".然而,"Masse"(质量,在物理学家的意义上,不是基督徒'一个字.另一个例子,土耳其语有4个"i"(小和大写,有和没有点),ASCII只有2个(小点和大写没有点),因此你将丢失有关点的信息或是否是一封大写字母.

因此,不会丢失信息的唯一方法(换句话说:损坏的数据)是以某种方式将非ASCII字符编码为ASCII字符序列.有许多流行的编码方案:SGML实体引用,MIME,Unicode转义序列,Τ Ε Χ或LaΤ Ε Χ.因此,您将在数据进入系统时对其进行编码,并在数据离开系统时对其进行解码.

当然,最简单的方法是简单地修复你的系统.