其他分享
首页 > 其他分享> > c – 协议缓冲区和UTF-8

c – 协议缓冲区和UTF-8

作者:互联网

编码方案/多个操作系统和字节序的历史导致编码所有形式的字符串数据( – 即所有字母表)的混乱;因此协议缓冲区只在其字符串类型中处理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序列化.

解决方法:

它可能有点过分,但ICU libraries将完成你需要的一切,你可以在Windows和Linux上使用它们.

但是,如果您只想转换,那么在Windows下,对MultiByteToWideChar和WideCharToMultiByte的简单调用可以在UTF-8和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中使用它.

标签:c,portability,unicode,utf-8,protocol-buffers
来源: https://codeday.me/bug/20190724/1519169.html