2016-08-03 17 views
-1

アラビア語と西洋のテキストが混在するファイルを読む際に問題が発生しています。読み込み中のファイルのBOMを設定する方法

tbx1.Text = File.ReadAllText(fileName.Text, Encoding.UTF8); 

をどんなに私は、アラビア語の代わりに表示文字化けを得た「Encoding.UTF8」の代わりにしようとしたどのような値は次のないように私は、テキストボックスにファイルを読み込みます。西洋のテキストはうまく表示されました。

私はそれがテキストボックスが定義された方法に問題があったが、上の私はテキストボックスにいくつかの混合西洋/アラビア語のテキストを書き、これがうまく表示起動しているかもしれないと思った:

tbx1.Text = "Start السلا عليكم" + Environment.NewLine + "Here"; 

その後、私は開きましたメモ帳を開き、上のテキストをコピーしてから、そのファイルを保存しました。メモ帳の保存ダイアログでは、使用するエンコードを尋ねました。

enter image description here

私はその後、私のコードに保存したファイルを提示し、それが正しく、すべてのコンテンツを表示します。

Iファイルを調べ、始めに3バイナリバイト(メモ帳では見えない)が見つかりました:3バイト

enter image description here

を、Iは、その後の研究により求めBOMを表し、これは、C#を可能"File.ReadAllText(fileName.Text、Encoding.UTF8);"必要に応じてデータを読み取り/表示する。

「Encoding.UTF8」の値を指定することで、この問題を解決する必要があります。

私が考えることができる唯一の方法は、このデータをファイルのコピーに追加し、そのファイルを処理するステップをコーディングすることです。しかし、これはむしろ長らく見えているようです。より良い方法があるのか​​、なぜEncoding.UTF8が望みの結果をもたらさないのか不思議です。

編集:

まだ運の回答で提案をしようとするにもかかわらず。

次のように私はアラビア語を含むまでのテストデータをカット:

enter image description here

コードを次のように

第二に、「真」と「偽」の両方を試してみました
FileStream fs = new FileStream(fileName.Text, FileMode.Open); 
StreamReader sr = new StreamReader(fs, Encoding.UTF8, false); 
tbx1.Text = sr.ReadToEnd(); 
sr.Close(); 
fs.Close(); 

を両方とも同じ結果が得られます。

メモ帳++でファイルを開き、アラビア語のISO-8859-6文字セットを指定した場合は、問題なく表示されます。ここで

は++メモ帳でどのように見えるかである(と私は表示するテキストボックスをliekます):

enter image description here

ない問題は、ファイルからの読み込み、またはへの書き込みである場合に確認してくださいテキストボックス。

私は読んだデータ投稿を調べることを試みます。しかし、現時点では私は困惑しています。

+0

http://stackoverflow.com/questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom –

+0

あなたはおそらくファイルを示し、それは」doesnの助けてください。 BOMは議論の余地がありますが、UNIX OSはutf-8を採用していますが、ほとんどのユーティリティはBOMを適切に処理できません。 Encoding.UTF8を渡すときは、BOMを検出するためにFileクラスに任せておきます。実際のファイル内容で16進ダンプを更新します。 –

+1

アラビア文字と思われるバイトは、実際にはその文字の正しいUTF8表現ですか?私は非常に頻繁にUTF8として渡される文字を見ましたが、実際には別の文字セット(ISO-8859-6やWindows-1256など)のバイトです。これは、このような表示の問題につながります。 –

答えて

2

StreamReaderクラスはあなたのためのBOMのための試験の世話をしますconstructorがあります

using (var stream = new FileStream(fileName.Text, FileAccess.Read)) 
{ 
    using (var sr = new StreamReader(stream, Encoding.UTF8, true)) 
    { 
     var text = sr.ReadToEnd(); 
    } 
} 

最終trueパラメータがdetectEncodingFromByteOrderMarkです:

detectEncodingFromByteOrderMarksパラメータ検出エンコーディングはストリームの最初の3バイトを見て行います。それは自動的に認識します。

  • UTF-8
  • リトルエンディアンUnicodeの
  • とビッグエンディアンUnicodeのテキスト

を適切なバイトオーダーマーク付きファイル 開始した場合。それ以外の場合は、 ユーザー提供エンコーディングが使用されます。詳細については、Encoding.GetPreambleメソッド を参照してください。メモ帳は、それを書いた後

+0

ディーンありがとうございます。あなたの答えは理にかなっていますが、私はまだ希望の結果を得ることができません。あなたの提案を試した後に結果を見るために質問に私の "編集"を見てください。 – TenG

関連する問題