私のプログラムに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
は、\ rの作品をもののようなものを試してみました、\ nは壊れ\ rを\に置き換えられ、N、そう\ rを\私の文字列のnは0Dになります00 00 0A 00 –
はい、これは\ r \ nで起こると思いました。あなたは1つではなく2つの改行を得るので、0D 00 0A 00が悪いと思います。 – schnaader
"ベストプラクティスは\ rを使用しています。"というよりはむしろ、特定のプラットフォームで有効なファイルを書くことができるライブラリを使います。例えば、dos/windowsでは\ r \ n、Linuxでは\ Macの場合はrです。 arだけでなく、Windowsの改行を含む有効なリトルエンディアンのutf-16ファイルを使用しているファイルを使用する他の多くのものを壊す可能性があります。 –