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

ada*_*dam 0 c++ unicode utf-8

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

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

-61(Hi Byte) 
-74(Lo Byte)
(unsigned value = 46787)
Run Code Online (Sandbox Code Playgroud)

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

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

Linux中带有扩展字符(128-255)的open()函数返回-1错误

临时解决方案: C ++ 11支持使用以下命令转换为UTF-8:codecvt_utf8

Rem*_*eau 5

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

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


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

  • 从CP437转换为UTF-16或UTF-32 / UCS-4(如果可以codecvt为CP437 获取/制作一个)。

  • 然后,将其从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_utf16UTF-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查找表,然后手动进行转换,一次转换一个字节。