9

c#でテキストファイルをANSIからUTF8に変換する際に問題が発生しました。結果をブラウザに表示しようとしています。

だから私はその中に多くのアクセント文字を含むこのテキストファイルを持っています。ANSIでエンコードされているため、ブラウザではアクセント文字の代わりに「?」が表示されるため、utf8に変換する必要があります。どのようにUTF8に変換しようとしても、それはまだ「?」でした。しかし、notepad ++のテキストファイルをutf8に変換すると、アクセント文字が適切に表示されます。

これが私が作ったコードの平和です:

    public string Encode(string text)
    {
        // encode the string as an ASCII byte array
        byte[] myASCIIBytes = ASCIIEncoding.ASCII.GetBytes(text);

        // convert the ASCII byte array to a UTF-8 byte array
        byte[] myUTF8Bytes = ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, myASCIIBytes);

        // reconstitute a string from the UTF-8 byte array 
        return UTF8Encoding.UTF8.GetString(myUTF8Bytes);
    }

なぜこれが起こっているのか分かりますか?

4

7 に答える 7

18

なぜこれが起こっているのか分かりますか?

はい、手遅れです。ファイルから文字列を読み取るときにANSIを指定する必要があります。メモリ内では常にUnicode(UTF16)です。

于 2010-09-23T12:18:52.973 に答える
12

ASCII に変換すると、ASCII には 127 (7 ビット) の文字しかないため、英語以外のすべての文字 (アクセント付きの文字を含む) がすぐに失われます。

あなたは奇妙な操作をします。stringin .net は UTF-16 であるため、一度戻ったらstringbyte[]これは問題ではありません。

私はあなたがすべきだと思います:(ANSIでLatin1を意味すると思います)

public byte[] Encode(string text)
{
    return Encoding.GetEncoding(1252).GetBytes(text);
}

質問があまり明確ではなかったため、実際にこれが必要になる可能性があるという合理的な発言があります。

public string Decode(byte[] data)
{
    return Encoding.GetEncoding(1252).GetString(data);
}
于 2010-09-23T12:24:22.913 に答える
6

これはおそらく最も簡単な方法です:

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);
于 2012-10-15T11:37:32.360 に答える
1

このhttp://www.joelonsoftware.com/articles/Unicode.htmlを読むことをお勧めします。
ASCII ファイルを読み取る場合は、ファイルのコード ページを知る必要があります。

于 2010-09-23T13:15:57.810 に答える
0

ここでの私の考えは、ファイルをNotepad ++に保存すると、Byte-Order-Markが挿入されるため、ブラウザーはこれからUTF8であると推測できます。それ以外の場合は、DTDやXMLなどのように、ブラウザに文字エンコードを明示的に指示する必要があります。

于 2010-09-23T12:19:43.827 に答える
0

これは、元のstring textファイルに無効な文字が既に含まれているために発生している可能性があります。エンコード変換は、入力がバイト配列である場合にのみ意味があります。したがって、ファイルを文字列ではなくバイト配列として読み取るか、ヘンクが言ったように、ファイルを読み取るためのエンコーディングを指定する必要があります。

于 2010-09-23T12:22:37.503 に答える