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

6
我需要一段C++代码,将给定的字符串转换为UTF-16字符串。它必须在Windows和Linux上都能工作。我在搜索过程中查看了很多网页,但这个主题对我来说仍然不清楚。
据我所知,我需要:
1. 使用LC_TYPE和UTF-16编码调用setlocale。 2. 使用wcstombs将wchar_t转换为UTF-16字符串。 3. 调用setlocale以恢复先前的语言环境。
您知道如何以可移植的方式(Windows和Linux)将wchar_t*转换为UTF-16吗?

也许我的与编码相关的问题#1, #2, #3对您有所帮助。 - Kerrek SB
2
wchar_t 字符串在哪个编码集中?你期望使用什么类型来表示 UTF-16 字符串中的字符类型?这只是在 uint16_t 中 UTF-32(在 wchar_t 中)和 UTF-16 之间的转换吗?还是涉及到代码集转换呢?可悲的是,可移植性是一个高尚的目标,但并非总是可以实现。请调查 ICU - Jonathan Leffler
5个回答

8

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


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

一切都很好,除了G++(或者更准确地说是libstdc++)还没有提供<codecvt>头文件,因此std::codecvt_utf16不可用。 - Tom
1
C++11 还引入了 char16_tchar32_t 类型(以及相关的 std::basic_string typedefs),以避免 wchar_t 平台问题。例如,无论何时需要一个 UTF-16 编码的字符串,都可以使用 std::u16string - Remy Lebeau

3
在非Windows环境中,您可以假设wchar_t是utf-32。这在Linux、Mac OS X和大多数*nix系统上都是正确的(几乎没有任何例外,而且您可能永远不会接触到这些系统 :-))。而在Windows上,wchar_t是utf-16。因此,在Windows上,转换函数只需执行memcpy操作 :-)
在其他所有情况下,转换是基于算法的,并且非常简单。因此,不需要第三方库的高级支持。
以下是基本算法:http://unicode.org/faq/utf_bom.html#utf16-3 如果您不想编写自己的实现,您可能会找到十几种不同的实现方式 :-)

2
问题在于的规范性不够明确。您可以使用GNU libiconv来实现您想要的功能。它接受特殊编码名称"wchar_t"作为源编码和目标编码。这样就可以在Windows、Linux以及其他提供libiconv的地方进行移植了。

-1

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


你是在提问还是陈述事实? - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接