2009-02-26 23 views

答えて

1

Encoding.UTF8またはEncoding.Unicode。

StreamReaderクラスには、boolパラメータがあり、そのコンストラクタでエンコーディングを自動検出できます。

+0

ないを読み取るために文化を置くことができます。それは入力エンコーディングに依存します。 –

+0

BOMなしでUnicodeファイルを保存したい場合は、それが問題です:) – leppie

+0

ストリームに書き込むことではなく、読み込みに関する質問です) –

0

ユニコード=> UTF-8/UTF-16? :)

+0

あなたは8秒でそれを逃しました:) – leppie

+0

私は速いタイピングスキルに取り組む必要があります^^ – cwap

9

元のデータのエンコーディングは何でも使用してください。どこからデータを取得していますか、それがどのエンコーディングになっているかに関する情報がありますか?間違ったエンコーディングで読み込もうとすると、間違った答えが返されます:エンコーディングが文字を処理できるとしても、バイナリデータを誤って解釈するでしょう。

を取得してを選択すると、通常はUTF-8が適しています。あなたが遠く離れた東方のキャラクターをたくさん持っているなら、それはサイズの点で悪いですが、そうでなければ良いです。特に、ASCIIはまだ1文字あたり1バイトで出てきます。

+0

ファイルのエンコーディングはどうすればわかりますか?プログラムは多くの場所から多くのファイルを使用します。ありがとう –

+0

@Scott:あなたは、信頼できることができません。ファイルにはエンコーディングが含まれていません。あなたはそれを知る必要があります。たとえば、* every *ファイルは有効なWindows-1252ファイルですが、実際にはUTF-8の場合、結果は大きく異なります。 –

+1

@Jon:Unicodeファイルには、BOM(バイトオーダーマーク)が含まれていて、エンコーディングの検出にUnicodeファイル(およびStreamReader)が使用できると仮定しています。 – leppie

3

エンコーディングはすべて、文字に8ビットを使用すると、256個の別個の文字しか扱えないという事実にまで及んでいます。英国と米国が規約を制定しているのを見ると、256の標準ASCII文字は主にアクセントのない西洋文字です。

ここで、UTF8とUTF16が再生されます。 UTF8はASCIIによく似ています。ほとんどの西洋文字に1バイトを使用します。しかし、通常のASCII範囲外の文字を示す特別なバイトがあります。特殊バイトの直後の2バイトが真の文字を示します。

UTF16(Unicodeとも呼ばれます)は特別なインジケータバイトを使用せず、すべての文字に16ビットを使用します。皆さんが知っているように、16ビットは65536個の異なる文字を提供しますが、これは世界の文字をすべてカバーするには十分ではありませんが、大部分はその仕事をします。

あなたの質問に答えてください:あなたのキャラクターの大部分がアクセントのない西洋人のキャラクターである場合、UTF8はあなたにとって最もコンパクトな表現です(多くのエディターで最も読みやすい)。大部分のキャラクターが非西洋(たとえば中国語)の場合、おそらくUnicode(別名UTF16)を使用することになります。

幸運を祈る!

4

他のすべての回答と同様に、適切なエンコーディングを使用する必要があります。

エンコードを検出する方法が問題です。それはあなたのファイルのソースに依存します。

  1. それがXMLファイルである場合は、エンコーディングを指定するファイルの先頭に<?xml>処理命令があるはずです。それがなければ、それはUTF8であると仮定すべきです。
  2. テキストファイルの場合は、UTF8エンコーディングを試すか、失敗すると、実行しているマシンのシステムロケールを試してみる必要があります。それが失敗した場合は、ファイルが作成されたマシンのシステムロケールを知ることができない人が分からない限り、あなたはほとんどあなた自身です。

いずれの場合でも、UTF8にフォールバックしてUTF16を使用して、すべてのファイルの約90%をカバーすることができます。過去5年間のほぼすべてのプログラムや言語がUnicodeをサポートしています。しかし、中国から多くのファイルを消費する場合は、最初にUTF16を試してみてください。これは、GB18030をエンコードするためにもう少し一般的です。

+0

企業間メッセージングシステムで働いている人々から聞いたことから、ユニコードエンコーディングは、あなたが述べたようにまだ普及していません。まったく。業界では、他のシステムで行われた誤ったデコードを検出して修正するようなハックが一般的です。 –

1

完全に信頼できる方法はありませんが、ヒューリスティックを使用してエンコードを推測できます。

  1. byte order markを探します。
  2. BOMが見つからない場合は、ファイルがUTF-8であると想定し、解析してみます。 XMLファイルの場合は、宣言にエンコーディングが含まれている可能性があります。同様に、HTMLファイルにはメタエンコードタグが含まれている場合があります。
  3. 上記のすべてに失敗した場合は、UTF-8(またはANSI - あなたの選択)と仮定します。

Rick Strahl has a handy article BOMを介したエンコーディングの検出について。これはちょっと古い - System.Text.EncodingにはGetPreambleメソッドがあり、StreamReaderにはエンコードが検出されるようなオーバーロードがあります。

8

また、あなたは、Cááなどのような奇妙なcarachteres必ずしも

CultureInfo pt = CultureInfo.GetCultureInfo("pt-BR"); 
StreamReader fileReader = new StreamReader("C:\temp\test.txt",Encoding.GetEncoding(pt.TextInfo.ANSICodePage),true); 
関連する問題