簡體   English   中英

協議緩沖區和UTF-8

[英]Protocol buffers and UTF-8

編碼方案/多個操作系統和端點的歷史導致編碼所有形式的字符串數據(--ie,所有字母表)的混亂; 因此協議緩沖區只在其字符串類型中處理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序列化。

Boost序列化庫包含一個UTF-8 codecvt facet ,可用於將unicode轉換為UTF-8並返回。 甚至在文檔中也有一個例子。

看看UTF8-CPP

// converts a utf-8 encoded std::string s to utf-16 wstring ws
utf8to16(s.begin(), s.end(), back_inserter(ws));

它可能有點過分,但ICU庫將完成您所需的一切,您可以在Windows和Linux上使用它們。

但是,如果您只想轉換,那么在Windows下,對MultiByteToWideCharWideCharToMultiByte的簡單調用可以在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中使用它。

在Linux上它是微不足道的:每個wchar_t是一個Unicode代碼點,並且使用普通的bitop,你可以找到相應的UTF-8字節。 在Windows上它並不困難,因為它有一個API: WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), &out[0], out.size(), 0,0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM