エンコーディングの問題

私はエンコーディングに大きな問題があります。私が使用しているコードはうまくいくはずですが、そうではありません!

ここにコードです:

FileStream fs = new FileStream(saveFile, FileMode.Create, FileAccess.Write, FileShare.None);

System.IO.StreamWriter objWriter;
objWriter = new System.IO.StreamWriter(fs , Encoding.Unicode);
string textLine;
if (System.IO.File.Exists(readFile) == true)
{
    System.IO.StreamReader objReader;
    objReader = new System.IO.StreamReader(readFile, Encoding.Unicode);

    do 
    {
        textLine = objReader.ReadLine();
        if (textLine.IndexOf(searchString) != -1)
        {
            tempString = textLine;
            position1 = textLine.IndexOf(searchString);

            tempString = textLine.Substring(position1);
            if (tempString.IndexOf("(") != -1)
            {
                position2 = tempString.IndexOf("(");
                //MessageBox.Show(tempString.Length.ToString());
                tempString = tempString.Substring(0, position2);
            }
        }

        objWriter.WriteLine(textLine);
    } while (objReader.Peek() != -1);
}
objWriter.Close();
MessageBox.Show(tempString);
MessageBox.Show("Done!");

英語の文字とキリル文字が混在しているファイルを読み込む必要がありますが、ファイルを読み込んで処理した後、ファイルを新しい場所に保存しようとすると、すべての文字は "?"または他の未知の記号である。私は可能なすべてのエンコードを試して、それは動作しません!

0
読み込んでいる入力ファイルがUnicodeでエンコードされていますか?
追加された 著者 Darin Dimitrov,
この16進数のテキスト、またはあなたの期待を表示することは可能ですか?
追加された 著者 Jodrell,
あなたは本当にそれらのすべてを試しましたか?ファイルの内容を表示している16進表示のスクリーンショットを投稿します。
追加された 著者 Hans Passant,
msdn.microsoft.com/en-us/library/ … 'このプロパティによって返されるUnicodeEncodingオブジェクトは、アプリケーションに対して適切な動作をしていない可能性があります。エンコードできない各文字列と、疑問符( "?")文字でデコードできない各バイトを置き換えるために、置換フォールバックが使用されます。 '
追加された 著者 jv42,
いいえ、わかりませんが、他のすべてのエンコーディングもテストしました。結果は同じです。
追加された 著者 Jordan,
cyrilicのものは140ではなく、私はすべてのcyrilicものをテストしました。ここに16進数のビューがあります:
追加された 著者 Jordan,
61 73 64 61 E4 E4 E0 F1 E4 E0 F1 E4 E0 F1 E4 0D 0A F4 F1 E4 0D 0A F4 E4 0D 0A E3 F4 E4 0D 0A E3 E4 0D 0A F4 E3 0D 0A F4 F5 0D 0A E3 F4 F5 0D 0A E3 E9 0D 0A 0D 0A F5 E9 EA E9 0D 0A 3B EB 0D 0A E5F0 0D 0A E2E5F0D 0A 20E2 0D 0A 20E2 0D 0A F0 0D 0A E5E2 20E4F4E3 20E4 0D 0A F4E3E4 0D 0A F4 E3 20 0D 0A E4 E3 E4 0D 0A F4 E3 20
追加された 著者 Jordan,
テキストはgibrishです...これはそれです:あなたの写真は、あなたが写真を撮っているかどうかを知ることができます。
追加された 著者 Jordan,

2 答え

あなたが掲示した例から、ファイルにはBOMがなく、それにキリル文字が含まれているようです。 BOMがなければ、 StreamReader は正しいエンコーディングを推測できません。ファイルにはキリル文字が含まれているため、 Windows-1251 エンコードを使用することができます(HEXあなたはコメント欄に示されているダンプ)。

だからここであなたが試してみることがあります:

using (var reader = new StreamReader("input.txt", Encoding.GetEncoding("Windows-1251")))
using (var writer = new StreamWriter("output.txt", false, Encoding.UTF8))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
       //reading the input file line by line ...
       //perform the parsing and write to the UTF-8 output encoded file
        writer.WriteLine(line);
    }
}
3
追加された
それは動作します!どうもありがとう!
追加された 著者 Jordan,

入力ファイルのエンコーディングがわからない場合は、指定しないで StreamReader 実装を検査します。

あなたのソースファイルは Unicode ではなく、あなたのローカルWindowsエンコーディングを使用していると思われます。

完全に新しいファイルを作成し、リーダーにエンコードを指定しないでください。

objReader = new System.IO.StreamReader(readFile); 
1
追加された
おそらくあなたのソースファイルにはBOMがありますが、コンテンツはUTFではありませんか?ソースファイルはどのようなエンコーディングですか?メモ帳でまったく新しいファイルを作成し、エンコーディングを指定しない場合はうまくいくはずです。
追加された 著者 Jodrell,
@ハンスパッサント、修正済み。
追加された 著者 Jodrell,
FileStreamはエンコーディングでは決して推測できません。バイトでのみ動作します。
追加された 著者 Hans Passant,
私はそれを最初からやっていましたが、うまくいきませんでしたので、それをエンコードして試してみました。できるだけすべてのスタンドアットエンコードと可能なすべてのサイレントエンコードをテストしました。結果は同じです。そして私は何が分からない。
追加された 著者 Jordan,
私はそれをテストするために新しいファイルを作ったし、それは動作しません。
追加された 著者 Jordan,