0

いくつかの csv ファイルを編集しています。セパレータとして常に「 ; 」があり、 「 」 」などがないため、ファイルは非常に簡単です。

そのため、ファイルを1行ずつ読み取り、文字列を分離することができます。それはうまくいっています。今、人々は私に言った:ファイルのエンコーディングを確認する必要があるかもしれません。それは常にANSIでなければなりません。そうでない場合、出力が異なり、破損する可能性があります。そのため、非 ansi ファイルは何らかの方法でマークする必要があります。

私はちょうど言った、オーケー!しかし、考えてみると、この場合、ファイルのエンコードを本当にチェックする必要がありますか? ファイルのエンコーディングを別のものに変更しただけで、問題なくファイルを読み取ることができます。私のコードは簡単です:

using (TextReader reader = new StreamReader(myFileStream))
{
  while ((line = read.ReadLine()) != null)
  {
    //read the line, spererate by ; and other stuff...
  }
}

繰り返しますが、ファイルの ANSI エンコーディングを確認する必要はありますか? ansi 以外のファイルを読み取った後、いつ問題が発生したり、出力が破損したりするのか、誰かが例を教えてくれませんか? ありがとうございました!

4

2 に答える 2

3

の特定のコンストラクターはStreamReader、データがUTF-8であると想定します。これはASCIIと互換性がありますが、データがシングルバイトコードページに128〜255の範囲のバイトを使用している場合(文字列などで間違った文字を取得する場合)に失敗する可能性があります。データは実際にはUTF-7、UTF-32などのように非常に異なるものです。

場合によっては(少数派)、バイト順マークを使用してエンコーディングを検出できる場合がありますが、これは循環的な問題です。ほとんどの場合、エンコーディングをまだ知らない場合は、実際にはわかりません。エンコーディングを(堅牢に)検出します。したがって、より良いアプローチは、最初にエンコーディングを知ることです。次に、他のコンストラクターの1つを介して使用する正しいエンコードを渡すことができます。

失敗した例を次に示します。

// we'll write UTF-32, big-endian, without a byte-order-mark
File.WriteAllText("my.txt", "Hello world", new UTF32Encoding(true, false));

using (var reader = new StreamReader("my.txt"))
{
    string s = reader.ReadLine();
}
于 2012-09-20T12:39:51.337 に答える
1

UTF-8エンコーディングで実行できます。causeには、バイト付きのASCII文字をUTF-8サポートするすばらしいプロパティがあります(予想どおり)が、必要に応じて、Unicode文字をサポートするように縮小します。1

絶対最小すべてのソフトウェア開発者は絶対に、積極的にUnicodeと文字セットについて知っている必要があります(言い訳はありません!)

于 2012-09-20T12:37:34.680 に答える