4

fopenでファイルを開くときに、ccs = encoding(MSDNで説明されているように)を使用してエンコーディングをUTF-8に設定しています。

ファイルに書き込むときは正常に機能します

wchar_t* unicode_text = L"こんにちは";
FILE* f = fopen("C:\\test.txt", "w,ccs=UTF-8");
fwprintf(f, L"%s\n", unicode_text);
fclose(f);

テキストエディタでファイルを開くと、Unicodeが正しく表示されます。ただし、作成されたファイルから読み取ろうとすると、UTF-8エンコーディングが検出されません。

wchar_t buffer[1000];
FILE* f = fopen("C:\\test.txt", "r,ccs=UTF-8");
fgetws(buffer, 1000, f);
fclose(f);

MessageBoxW(0, buffer, 0, 0);

メッセージボックスに「ããã«ã¡ã¯」と表示されます。

なぜこれが起こるのですか?ccs = UTF-8は、書き込み用にファイルを開く場合にのみ有効ですか?

4

4 に答える 4

2

これを試して

#include <locale.h>

setlocale(LC_ALL, "Japanese");
于 2012-05-17T11:13:56.990 に答える
2

ドキュメントは、UTF-8エンコーディングが書き込みにのみ利用可能であることを示唆しています(私の強調):

Visual C ++ 2005では、fopenはUnicodeファイルストリームをサポートしています。次のように、新しいファイルを開いたり、既存のファイルを上書きしたりするときに、目的のエンコーディングを指定するフラグをfopenに渡すことができます。

なお、「既存ファイルの読み込み」は目立ってありません。

于 2012-05-17T15:51:17.890 に答える
0

fgets、fgetwsを参照してください

fgetwsは、ストリームがテキストモードとバイナリモードのどちらで開かれているかに応じて、ワイド文字引数strをマルチバイト文字列またはワイド文字文字列として読み取ります。

「rb」を試してみてください。

于 2012-05-17T15:06:09.380 に答える
0

テキストからBOMを取り除くのと同じくらい簡単かもしれません。テキストボックスに表示されている最初の3文字( "")は、UTF-8ファイルのBOMのようです。

http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

于 2012-11-16T19:31:33.513 に答える