在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
答案 0 :(得分:4)
在Windows上,您可以使用Win32 MultiByteToWideChar()
函数将数据从CP437转换为UTF-16,然后使用WideCharToMultiByte()
函数将数据从UTF-16转换为UTF-8。 / p>
在Linux上,您可以使用Unicode转换库,例如libiconv或ICU(也适用于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