为什么可以';在windows上使用boost::locale::conv::between将UTF-16文本转换为其他编码 < >我的C++代码使用Boost转换编码。< /P>
如果我在cygwin上编译并运行代码,它可以正常工作,但是如果我使用mingw-w64或msvc11直接在windows命令行(cmd)上编译代码,下面的代码会抛出无效的字符集错误为什么可以';在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字
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
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区域设置。只需记住首先构建它,并随程序交付所需的运行时库/文件