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-

sthの提案はさらにそうです。ブーストシリアル化についてさらに調査します。

4

4 に答える 4

3

Boost Serialization ライブラリには、Unicode と UTF-8 の相互変換に使用できるUTF-8 codecvt ファセットが含まれています。ドキュメントには、まさにそれを行う例さえあります。

于 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 では、単純な呼び出しで UTF-8MultiByteToWideCharWideCharToMultiByteUTF-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が 1 つの 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 に答える