我需要一个C++代码来将wchar_t*
中给定的字符串转换为UTF-16字符串。它必须在Windows和Linux上都能工作。在搜索过程中,我浏览了很多网页,但主题对我来说仍然不清楚
据我所知,我需要:
- 使用LC_TYPE和UTF-16编码调用
setlocale
- 使用
wcstombs
将wchar_t
转换为UTF-16字符串 - 调用
setlocale
以恢复以前的区域设置
你知道我用可移植的方式(Windows和Linux)将wchar_t*
转换为UTF-16的方法吗?
在C++03中没有一个跨平台的方法可以做到这一点(并非没有库)。这在一定程度上是因为wchar_t
本身并不是跨平台的东西。在Windows下,wchar_t
是一个16位的值,而在其他平台上,它通常是一个32位的值。所以你需要两个不同的代码路径来完成。
C++11的std::codecvt_utf16
应该可以工作。
std::codecvt_utf16是一个std::codecvt方面,它封装了UTF-16编码的字节串与UCS2或UCS4字符串之间的转换(取决于Elem的类型)。
请参阅:http://en.cppreference.com/w/cpp/locale/codecvt_utf16
您可以假设wchar_t在非Windows世界中是utf-32。在Linux和Mac OS X以及大多数*nix系统上都是如此(很少有例外,在你可能永远不会接触的系统上:-)
wchar_t在Windows上是utf-16。因此,在Windows上,转换功能可以只做一个memcpy:-)
在其他方面,转换是算法性的,而且非常简单。因此,不需要第三方图书馆的大力支持。
以下是基本算法:http://unicode.org/faq/utf_bom.html#utf16-3
如果你不想写自己的:-)
问题在于wchar_t
的指定不足。你可以使用GNUlibiconv来做你想做的事情。它接受特殊的编码名称"wchar_t"
作为源编码和目标编码。这样,它将可移植到Windows和Linux以及其他可以提供libiconv的地方。
g++编译器似乎支持wcstomb?