6

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

据我了解,我需要:

  1. setlocale使用 LC_TYPE 和 UTF-16 编码调用。
  2. 用于wcstombs转换wchar_t为 UTF-16 字符串。
  3. 调用setlocale以恢复以前的语言环境。

你知道我可以wchar_t*以便携方式(Windows 和 Linux)转换为 UTF-16 的方式吗?

4

5 回答 5

8

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

于 2012-03-14T06:59:23.930 回答
5

我认为C++11std::codecvt_utf16应该可以工作。

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

看到这个:http ://en.cppreference.com/w/cpp/locale/codecvt_utf16

于 2012-03-14T06:55:01.957 回答
3

您可以假设 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

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

于 2012-03-22T09:27:10.207 回答
2

问题在于wchar_t指定不足。你可以使用 GNU libiconv 来做你想做的事。它接受特殊的编码名称"wchar_t"作为源编码和目标编码。这样,它将可以移植到 Windows 和 Linux 以及您可以提供 libiconv 的其他地方。

于 2012-03-14T07:57:15.393 回答
-1

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

于 2012-03-14T06:57:32.493 回答