2011-09-10 10 views
1

私が理解しているように、異なるロケールには異なるエンコーディングがあります。 ICUでは、UnicodeStringから現在のロケールのエンコーディングに変換して戻したいと思います。具体的には、Boostのファイルシステムライブラリを使用しています。これは、WindowsのUTF-16またはLinuxのUTF-8エンコーディングを使用します。ICU C++エンコーディングの変換

ICUや別のライブラリを使用して確実に行う方法はありますか?

+1

ICUは非常に重いライブラリーですが、おそらくこの単純なタスクのためには過剰です。 Linuxでは 'libiconv'、Windowsでは' WideCharToMultiByte'と 'MultiByteToWideChar'を考慮したいかもしれません。本当にしたいのなら、あなたもICUを使うことができます。 –

+0

ああ。私はわかりません、私はアプリケーションでUnicodeをサポートしたいだけです。 – Jookia

+0

[ICU UnicodeStringからロケールへのエンコーディング]の可能な複製(http://stackoverflow.com/questions/7370679/icu-unicodestring-to-locale-encoding) – tchrist

答えて

2

あなたはICUを使うことができますが、セットアップと操作がはるかに簡単です(Posixの一部で、Windowsで簡単に利用できます)iconv()で十分です。

どちらのライブラリでも、ユニコード文字列をワイド文字列に変換する必要があります。 iconv()では、そのターゲットはWCHAR_Tと呼ばれます。ワイド文字を取得したら、Windowsで直接使用することができます。

Linuxでは、あなたはあなたがUTFをしたいことが確実な場合は、代わりに、(setlocale(LC_CTYPE, "");を忘れないでください)システムの(およびロケールの)狭い文字マルチバイトエンコーディングにワイド文字を変換するためにwcstombs()を使用するように進めるか、どちらか-8では、元の文字列からUTF-8に直接変換することもできます(どちらのライブラリでも)。

多分this post私のいくつかの背景を提供する見つけるでしょう。

+0

私はUnicode用の文字列クラスを作成しなければならないでしょうか? – Jookia

+0

生コードポイント文字列には 'std :: vector 'を使ってください。できるだけ 'std :: vector 'を使ってください。また、 'std :: u32string'(' std :: basic_string 0123の文字列:: basic_string ')がありますが、文字列のデータバッファに書き込むことができないので、ベクトルが良いです。あなたが終わったら 'std :: u32string(v.begin()、v.end())'と言うことができます。 –

+0

UTF-8文字列ライブラリを見つけるのは賢明でしょうか? ASCIIセット、またはその上のBMPよりも高くなります)、それにiconvのものを追加しますか? – Jookia

関連する問題