3

ファイルを非同期的に書き込むためのこのコード スニペットがあります。

    private static async Task WriteTextAsync(string filePath, string text)
    { //Writes to our output files
        byte[] encodedText = Encoding.UTF8.GetBytes(text);
        using (FileStream sourceStream = new FileStream(filePath,
            FileMode.Create, FileAccess.Write, FileShare.None,
            bufferSize: 4096, useAsync: true))
        {
            await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
        };
    }

を設定したにもかかわらず、作成されたテキスト ファイルは ANSI 形式のままですEncoding.UTF8。クラスには 15 個のオーバーロードされたコンストラクターがありFileStream、エンコードされたテキストでない場合、これをどこに設定する必要があるかはまったくわかりません。

ファイルが ANSI であることがわかります。TextPad でファイルを開いてファイル統計を表示すると、ANSI がコード セットとしてリストされているからです。

ここに画像の説明を入力

MySQLLOAD INFILEがファイルを適切に読み取っていないため、問題が発生しています。回答を読んだ後、BOM と関係があると思いますが、よくわかりません。

私はこれを試しました(BOM用):

        byte[] encodedText = new byte[] { 0xEF, 0xBB, 0xBF }.Concat(Encoding.UTF8.GetBytes(text)).ToArray();
        using (FileStream sourceStream = new FileStream(filePath,
            FileMode.Create, FileAccess.Write, FileShare.None,
            bufferSize: 4096, useAsync: true))
        {
            await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
        };

その後、Textpad はそれを UTF8 として認識しましたが、MySQLLOAD INFILEはまだ失敗しました。Textpad で再保存すると、MySQL はそれを正しく認識しました。

コードを次のように変更しました。

        using (TextWriter writer = File.CreateText(filePath))
        {
            await writer.WriteAsync(text);
        }

これは両方で機能するようでした。これに関してMySQLの問題が何であるかはわかりませんLOAD INFILE

4

2 に答える 2

4

いいえ、間違いなく UTF-8 です:

byte[] encodedText = Encoding.UTF8.GetBytes(text);

それはあなたにUTF-8しか与えることができません。encodedText次に、ストリームに書き込みます。

でも!UTF-8 は、0 ~ 127 の範囲の任意の文字について ASCII/ANSI と同じように見えます。その上だけ見た目が違う。偽陽性?

于 2012-10-23T14:43:45.857 に答える
2

ファイルの先頭にBOM ヘッダーを書き忘れていると思います。FileStream を使用しているため (ある種の TextWriter ではありません)、手動で記述する必要があります。UTF-8の場合は「EF BB BF」となります。

于 2012-10-23T14:43:52.340 に答える