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

时间:2012-03-14 06:51:29

标签: c++ c unicode utf-16 wchar-t

我需要用C ++编写的代码将wchar_t*中给出的字符串转换为UTF-16字符串。它必须适用于Windows和Linux。我在搜索过程中浏览了很多网页,但我还不清楚这个主题。

据我所知,我需要:

  1. 使用LC_TYPE和UTF-16编码调用setlocale
  2. 使用wcstombswchar_t转换为UTF-16字符串。
  3. 致电setlocale以恢复以前的区域设置。
  4. 您是否知道我可以通过便携方式(Windows和Linux)将wchar_t*转换为UTF-16的方式?

5 个答案:

答案 0 :(得分:8)

在C ++ 03中没有单一的跨平台方法(不是没有库)。这部分是因为wchar_t本身并不是跨平台的相同事物。在Windows下,wchar_t是16位值,而在其他平台上,它通常是32位值。所以你需要两个不同的代码路径来完成它。

答案 1 :(得分:5)

C ++ 11的std::codecvt_utf16应该可行。我想。

  

std :: codecvt_utf16是一个std :: codecvt facet,它封装了UTF-16编码的字节串和UCS2或UCS4字符串之间的转换(取决于Elem的类型)。

请参阅:http://en.cppreference.com/w/cpp/locale/codecvt_utf16

答案 2 :(得分:3)

您可以假设wchar_t在非Windows世界中是utf-32。在Linux和Mac OS X以及大多数* nix系统上都是如此(很少有例外,在系统上你可能永远不会碰到: - )

Windows上的wchar_t是utf-16。所以在Windows上,转换功能只能做一个memcpy: - )

在其他一切方面,转换是算法的,非常简单。所以不需要第三方图书馆的支持。

以下是基本算法:http://unicode.org/faq/utf_bom.html#utf16-3

如果你不想自己编写,你可能会找到十几个不同的实现: - )

答案 3 :(得分:2)

问题在于wchar_t相当不明确。您可以使用GNU libiconv来执行您想要的操作。它接受特殊编码名称"wchar_t"作为源编码和目标编码。这样,它可以移植到Windows和Linux以及其他可以提供libiconv的地方。

答案 4 :(得分:-1)

g ++编译器似乎支持wcstombs?