2009-07-19 20 views
4

私のプログラムにutf-16(リトルエンディアン)インターフェイスを与えることができるファイルioライブラリが必要ですが、他のエンコーディング、主にascii(入力のみ)、utf-8、utf-16 、utf-32/ucs4(リトルエンディアンとビッグエンディアンのバイトオーダーの両方を含む)。C++ unicode file io

私が見つけた唯一のライブラリを見てみると、ICU ustdio.hライブラリでした。

私はそれを試してみましたが、非常に単純なテキストで作業することもできました。その使用方法についてはほとんどドキュメントがありません。ICUファイルリファレンスページでは、たとえば、既存のFILEからUFILEを作成した場合、FILE *を使用する他の関数をいくつかの他の関数とともに使用することは安全ですか?)。

またID遠く、むしろ私のCスタイルのインタフェースを介して広いストリームインタフェースを与えることができ、C++のライブラリ...

std::wstring str = L"Hello World in UTF-16!\nAnother line.\n"; 
UFILE *ufile = u_fopen("out2.txt", "w", 0, "utf-16"); 
u_file_write(str.c_str(), str.size(), ufile); 
u_fclose(ufile); 

出力

Hello World in UTF-16!਍䄀渀漀琀栀攀爀 氀椀渀攀⸀ഀ 

FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 
6F 00 72 00 6C 00 64 00 20 00 69 00 6E 00 20 00 
55 00 54 00 46 00 2D 00 31 00 36 00 21 00 0D 0A 
00 41 00 6E 00 6F 00 74 00 68 00 65 00 72 00 20 
00 6C 00 69 00 6E 00 65 00 2E 00 0D 0A 00 

編集:ウィンドウ上の正しい出力は:

FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 
6F 00 72 00 6C 00 64 00 20 00 69 00 6E 00 20 00 
55 00 54 00 46 00 2D 00 31 00 36 00 21 00 0D 00 
0A 00 41 00 6E 00 6F 00 74 00 68 00 65 00 72 00 
20 00 6C 00 69 00 6E 00 65 00 2E 00 0D 00 0A 00 

答えて

1

私は問題が0D 0A 00改行から来ると思います。 \r\nまたは単独のLFやCRを使用してのような他の改行が動作しない場合は、EDIT

(最善の策は、 \rを使用されるだろう、私が思う、)試みることができる:それは 0D 00 0A 00が何をしたいので、あなたが

std::wstring str = L"Hello World in UTF-16!\15\12Another line.\15\12"; 
を試すことができそうです
+0

は、\ rの作品をもののようなものを試してみました、\ nは壊れ\ rを\に置き換えられ、N、そう\ rを\私の文字列のnは0Dになります00 00 0A 00 –

+0

はい、これは\ r \ nで起こると思いました。あなたは1つではなく2つの改行を得るので、0D 00 0A 00が悪いと思います。 – schnaader

+0

"ベストプラクティスは\ rを使用しています。"というよりはむしろ、特定のプラットフォームで有効なファイルを書くことができるライブラリを使います。例えば、dos/windowsでは\ r \ n、Linuxでは\ Macの場合はrです。 arだけでなく、Windowsの改行を含む有効なリトルエンディアンのutf-16ファイルを使用しているファイルを使用する他の多くのものを壊す可能性があります。 –

2

UTF8-CPPは、UTF-8,16、および32の間の変換を行います。非常に素晴らしく軽いライブラリです。 ICUについて

、UTF8-CPP作成者によっていくつかのコメント:

ICU図書館。それは非常に強力で、 完全で、豊富な機能を持ち、成熟しており、 が広く使用されています。また、大きな、介入、 非ジェネリック、よく再生されません 標準ライブラリ。私は あなたがそれを使用する予定がない場合でも、ICU を見ることを確かにお勧めします。

:)

1

あなたはのiconv(libiconv)ライブラリを試すことができます。

4

問題は改行変換から発生します。残念なことに、バイトレベル(コード変換後)で行われ、エンコーディングを認識しません。 IOWsの場合、自動変換を無効にする必要があります(ファイルをバイナリモードで開き、 "b"フラグを使用).0A00を0D00A00に展開するには、自分で行う必要があります。

あなたがC++ワイドストリームインタフェースを好むので、私は私が私たちのソフトウェアでそれを達成するために何をしたか概説しますことを言及

  • ICU UConverterを使用してのstd :: codecvtファセットを書きますコンバージョンを実行します。
  • はstdを使用:: wfstreamをファイルを開くには
  • インビュー()wfstreamでカスタムcodecvt
  • オープンバイナリフラグでwfstreamを、自動(誤)改行変換をオフにします。
  • wcharsでラインフィード変換を実行するための "WnewlineFilter"を作成します。 from inspiration from boost::iostreams::newline_filter
  • boost::iostreams::filtering_wstreamを使用して、wfstreamとWNewlineFilterをストリームとして結合します。
関連する問題