如何将文本从CP437编码转换为UTF8编码?

时间:2017-10-25 20:39:21

标签: c++ unicode utf-8

在Windows中,CP437字符集中的Unicode字符ö(带有分音符的拉丁小写字母o)的值为148

在Linux中,UTF-8编码中ö的字节值为:

-61(Hi Byte) 
-74(Lo Byte)
(unsigned value = 46787)

我的问题是,如何在Linux上用C ++中的148从CP437转换为UTF-8?

我的问题的详细信息在于:

open() function in Linux with extended characters (128-255) returns -1 error

临时解决方案: C++11 supports the conversion to UTF-8 using codecvt_utf8

3 个答案:

答案 0 :(得分:4)

在Windows上,您可以使用Win32 MultiByteToWideChar()函数将数据从CP437转换为UTF-16,然后使用WideCharToMultiByte()函数将数据从UTF-16转换为UTF-8。 / p>

在Linux上,您可以使用Unicode转换库,例如libiconvICU(也适用于Windows)。

在C ++ 11及更高版本中,您可以使用std::wstring_convert来:

  • 从CP437转换为UTF-16或UTF-32 / UCS-4(如果您可以为CP437获取/ codecvt,那就是。)

  • 然后,从UTF-16或UTF-32 / UCS-4转换为UTF-8。

您无法使用codecvt_utf8直接从CP437转换为UTF-8。它仅支持以下之间的转换:

  • UTF-8和UCS-2(不是UTF-16!)

  • UTF-8和UTF-32 / UCS-4。

您必须使用codecvt_utf8_utf16进行UTF-8和UTF-16之间的转换。

或者,您可以使用mbrtoc16()使用CP437语言环境将CP437转换为UTF-16,然后使用c16rtomb()使用UTF-8语言环境将UTF-16转换为UTF-8(如果您的STL库实现了DR488的修复,否则c16rtomb()仅支持UCS-2而不支持UTF-16!)。

否则,只需为256个可能的CP437字节创建自己的CP437到UTF8查找表,然后手动进行转换,一次一个字节。

答案 1 :(得分:0)

它不在C ++中,但是您也可以使用bash转换文件:

$ iconv -f CP437 -t UTF-8 input_file_name.txt -o output_file_name.txt

答案 2 :(得分:-1)

我找到了将CP437转换为UTF8的解决方案。这在LINUX中完美运行

        BYTE high, low;
        WORD result;
        if (sCMResult.wChar > 0x80 && sCMResult.wChar <= 0x7ff)
        {
            low = (0xc0 | ((sCMResult.wChar >> 6) & 0x1f));
            high = (0x80 | (sCMResult.wChar & 0x3f));
            result = low | (high << 8);
        }

可以找到完整的帖子here