3

文字セットとエンコーディングを正しく理解する必要があります。C# でのさまざまな文字セットの処理に関する適切な記事を教えてもらえますか?

これが私が直面している問題の1つです-

        using (StreamReader reader = new StreamReader("input.txt"))
        using (StreamWriter writer = new StreamWriter("output.txt")
        {
            while (!reader.EndOfStream)
            {
                writer.WriteLine(reader.ReadLine());
            }
        }

この単純なコード スニペットは、常にエンコーディングを保持するとは限りません -

例えば ​​-

入力の Aukéna は、出力で Auk�na に変換されます。

4

4 に答える 4

5

エンコーディングの問題があります。実際に読んでいるのはビットのストリームだけであることを覚えておく必要があります。これらのビットを適切に解釈する方法をプログラムに指示する必要があります。

問題を解決するには、エンコーディングも受け取るコンストラクターを使用し、テキストが使用するエンコーディングに設定します。

http://msdn.microsoft.com/en-us/library/ms143456.aspx

http://msdn.microsoft.com/en-us/library/3aadshsx.aspx

于 2012-08-24T04:28:37.880 に答える
2

StreamReader.ReadLine()UTFエンコーディングを使用してファイルを読み取ろうとします。ファイルが使用する形式ではない場合、StreamReader は文字を正しく読み取れません。

この記事では、この問題について詳しく説明し、コンストラクターにこの encoding を渡すことを提案していますSystem.Text.Encoding.Default

于 2012-08-24T04:30:24.303 に答える
2

ファイルを読み取るときは、ファイルのエンコーディングを知っておく必要があると思います。そうしないと、正しく読み取れない可能性があります。

ファイルのエンコーディングがわかっている場合は、次の操作を実行できます。

        using (StreamReader reader = new StreamReader("input.txt", Encoding.GetEncoding(1251)))
        using (StreamWriter writer = new StreamWriter("output.txt", false, Encoding.GetEncoding(1251)))
        {
            while (!reader.EndOfStream)
            {
                writer.WriteLine(reader.ReadLine());
            }
        }

ファイルの元のエンコーディングを変更したい場合は、別の質問が出てきます。

次の記事は、エンコーディングとは何かについての良い基礎を提供するかもしれません: すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セットについて知っておく必要がある絶対的な最小値 (言い訳はありません!)

そして、これはリンクの msdn 記事であり、そこから始めることができます: Encoding Class

于 2012-08-24T04:29:31.847 に答える
0

いつでも独自のパーサーを作成できます。私が使用するものは次のとおりです。

`var ANSI = (エンコーディング) Encoding.GetEncoding(1252).Clone();

ANSI.EncoderFallback = new EncoderReplacementFallback(string.Empty);`

この最初の行は、Win-1252 エンコーディングのクローンを作成します (私が扱うデータベースは Win-1252 で動作するため、おそらく UTF-8 または ASCII を使用することをお勧めします)。2 行目 (文字を解析するとき) は、元の文字に相当する文字がない場合、空の文字列を返します。

この後、すべてのコマンド文字 (必要に応じて、タブ、スペース、改行、改行を除く) を除外することをお勧めします。

以下は、データベースに入力されるデータを修正するために設定した、私の個人的なエンコーディング パーサーです。

private string RetainOnlyPrintableCharacters(char c)
{
//even if the character comes from a different codepage altogether, 
//if the character exists in 1252 it will be returned in 1252 format.
    var ansiBytes = _ansiEncoding.GetBytes(new char[] {c});

    if (ansiBytes.Any())
    {
        if (ansiBytes.First().In(_printableCharacters))
        {
            return _ansiEncoding.GetString(ansiBytes);
        }
    }
    return string.Empty;
}

_ansiEncoding は、var ANSI = (Encoding) Encoding.GetEncoding(1252).Clone(); から取得されます。フォールバック値を設定して

ansiBytes が空でない場合は、渡された特定の文字に利用可能なエンコーディングがあることを意味するため、すべての印刷可能な文字のリストと比較され、存在する場合は受け入れ可能な文字であるため、返されます。

于 2012-08-24T04:47:04.177 に答える