将wchar_t*转换为UTF-16字符串



我需要一个C++代码来将wchar_t*中给定的字符串转换为UTF-16字符串。它必须在Windows和Linux上都能工作。在搜索过程中,我浏览了很多网页,但主题对我来说仍然不清楚

据我所知,我需要:

  1. 使用LC_TYPE和UTF-16编码调用setlocale
  2. 使用wcstombswchar_t转换为UTF-16字符串
  3. 调用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?

最新更新