Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';在windows上使用boost::locale::conv::between将UTF-16文本转换为其他编码 < >我的C++代码使用Boost转换编码。< /P>_C++_Boost_Unicode_Character Encoding_Utf 16 - Fatal编程技术网

为什么可以';在windows上使用boost::locale::conv::between将UTF-16文本转换为其他编码 < >我的C++代码使用Boost转换编码。< /P>

为什么可以';在windows上使用boost::locale::conv::between将UTF-16文本转换为其他编码 < >我的C++代码使用Boost转换编码。< /P>,c++,boost,unicode,character-encoding,utf-16,C++,Boost,Unicode,Character Encoding,Utf 16,如果我在cygwin上编译并运行代码,它可以正常工作,但是如果我使用mingw-w64或msvc11直接在windows命令行(cmd)上编译代码,下面的代码会抛出无效的字符集错误 boost::locale::conv::between( encheckbeg, encheckend, consoleEncoding, getCodingName(codingMethod) ) encheckbeg和encheckend是指向char的指针。 consoleEncoding是一个c字

如果我在cygwin上编译并运行代码,它可以正常工作,但是如果我使用mingw-w64或msvc11直接在windows命令行(cmd)上编译代码,下面的代码会抛出无效的字符集错误

boost::locale::conv::between( encheckbeg, encheckend, consoleEncoding,
    getCodingName(codingMethod) )
encheckbeg和encheckend是指向char的指针。 consoleEncoding是一个c字符串,它可以是“Big5”或“UTF-8”。 getCodingName返回c-string,其内容为字符集名称

当getCodingName返回“UTF-16LE”或“UTF-16BE”时,我得到了异常。其他chaset名称,如“Big5”、“GB18030”、“UTF-8”,我已经测试过这些名称,boost::locale::conv::between可以识别它们。所以我认为问题出在UTF-16上


boost的字符集转换是否依赖于操作系统的语言环境机制,所以出现了上述问题?为什么不使用UTF-16呢?我该如何解决这个问题呢?

Boost Locale不是一个只包含标题的库。有3种实现方式:

  • ICU:使用ICU4C库
  • iconv:使用iconv库
  • wconv:使用windowsapi
使用MSVC构建Boost区域设置时,wconv是默认选择。 不幸的是,用于执行转换的windows API(例如)不支持UTF-16(您可以查看API说明。我认为原因是
wchar\u t(LPWSTR)
已经是UTF-16了…)

一种可能的解决方案是为UTF-16添加额外代码,例如:

std::string mbcs = std::string("...");
std::wstring wstr = boost::locale::conv::to_utf<wchar_t>(mbcs,"Big5");//for Big5/GBK...
//wstr = boost::locale::conv::utf_to_utf<wchar_t>(utf8str);//for UTF-8
std::wstring_convert<std::codecvt_utf16<wchar_t>> utf16conv;//for UTF-16BE
//std::wstring_convert<std::codecvt_utf16<wchar_t, 0x10ffff, little_endian>> utf16conv;//for UTF-16LE
std::string utf16str = utf16conv.to_bytes(wstr);
std::string mbcs=std::string(“…”);
std::wstring wstr=boost::locale::conv::to_utf(mbcs,“Big5”)//对于Big5/GBK。。。
//wstr=boost::locale::conv::utf_to_utf(utf8str)//对于UTF-8
std::wstring_convert utf16conv//对于UTF-16BE
//std::wstring_convert utf16conv//对于UTF-16LE
字符串utf16str=utf16conv.to_字节(wstr);
当然,您也可以使用ICU构建Boost区域设置。只需记住首先构建它,并随程序交付所需的运行时库/文件