3

编码方案/多个操作系统和字节序的历史导致在编码所有形式的字符串数据(即所有字母)方面一团糟;出于这个原因,协议缓冲区仅处理其字符串类型中的 ASCII 或 UTF-8,而且我看不到任何接受 C++ wstring 的多态重载。那么问题是如何将 UTF-16 字符串放入协议缓冲区?

大概我需要将数据作为 wstring 保存在我的应用程序代码中,然后在将其填充(或从中提取)消息之前执行 UTF-8 转换。什么是最简单的 - Windows/Linux 可移植方式来做到这一点(来自受良好支持的库的单个函数调用会让我很开心)?

数据将来自各种 Web 服务器(Linux 和 Windows),最终将到达 SQL Server(可能还有其他端点)。

-- 编辑 1--

Mark Wilkins 的建议似乎符合要求,也许对库有经验的人可以发布一个代码片段——从 wstring 到 UTF-8——这样我就可以判断它有多容易。

-- 编辑 2 --

……的建议更是如此。我将进一步研究 boost 序列化。

4

4 回答 4

3

Boost Serialization 库包含一个UTF-8 codecvt facet,可用于将 unicode 转换为 UTF-8 并返回。文档中甚至有一个示例正是这样做的。

于 2010-01-26T14:07:41.320 回答
3

看看UTF8-CPP

// converts a utf-8 encoded std::string s to utf-16 wstring ws
utf8to16(s.begin(), s.end(), back_inserter(ws));
于 2010-01-26T16:20:53.650 回答
2

这可能有点矫枉过正,但ICU 库将满足您的所有需求,您可以在 Windows 和 Linux 上使用它们。

但是,如果你只是想要转换,那么在 Windows 下,一个简单的调用就MultiByteToWideChar可以WideCharToMultiByte在 UTF-8 和

UTF-16。例如:

// utf-8 to utf-16
MultiByteToWideChar( CP_UTF8, 0, myUtf8String, -1,
                     myUtf16Buf, lengthOfUtf16Buf );

对于 Linux,libidn 可能会满足您的需求。它可以在 UTF-8 和 UCS 之间进行转换,我认为这在某种程度上相当于 UTF-32。例如:

// utf-8 to UCS
ucsStr = stringprep_utf8_to_ucs4( "asdf", 4, &items );

但是,在 Linux 中,我认为您最好只使用 UTF-8。除非您有一个现有的 UTF-16 库,否则我不确定在 Linux 中使用它是否有令人信服的理由。

于 2010-01-26T13:57:57.800 回答
1

在 Linux 上,这很简单:每个wchar_t都是一个 Unicode 代码点,通过简单的 bitops,您可以找到相应的 UTF-8 字节。在 Windows 上这并不难,因为它有一个 API:WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), &out[0], out.size(), 0,0);

于 2010-01-26T14:08:14.993 回答