問題のANSIをUTF8 C#に変換する
質問
C#でANSIからUTF8にテキストファイルを変換することに問題があります。結果をブラウザに表示しようとします。
だから、私はこのテキストファイルが多く、多くのアクセントキャラクターが入っています。 ANSIでエンコードされているため、アクセントが表示されるのではなくブラウザで「?」であるため、UTF8に変換する必要があります。どのようにUTF8に変換しようとしたとしても、それはまだ「?」でした。ただし、メモ帳++のテキストファイルを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);
}
なぜこれが起こっているのか分かりますか?
解決
なぜこれが起こっているのか分かりますか?
はい、手遅れです。ファイルから文字列を読むときにANSIを指定する必要があります。メモリでは、常にUnicode(utf16)です。
他のヒント
ASCIIには127(7ビット)の文字しかないため、ASCIIに変換すると、すぐにすべての非英語のキャラクター(アクセントのあるものを含む)が失われます。
あなたは奇妙な操作をします。 string
.NETではUTF-16にあるので、戻ったら string
, 、 いいえ byte[]
これは問題ではありません。
私はあなたがすべきだと思います:(私はANSIであなたがラテン語を意味すると思います)
public byte[] Encode(string text)
{
return Encoding.GetEncoding(1252).GetBytes(text);
}
質問はあまり明確ではなかったので、実際にこれを必要とするかもしれないという合理的な発言があります。
public string Decode(byte[] data)
{
return Encoding.GetEncoding(1252).GetString(data);
}
これはおそらく最も簡単な方法です:
byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);
これを読むことをお勧めします http://www.joelonsoftware.com/articles/unicode.html.
ASCIIファイルを読み取る場合は、ファイルのコードページを知る必要があります。
これはおそらくあなたのオリジナルのために起こっています string text
すでに無効な文字が含まれています。エンコード変換は、入力がバイト配列である場合にのみ理にかなっています。したがって、ファイルを文字列の代わりにバイト配列として読み取るか、ヘンクが言ったように、ファイルを読み取るためのエンコードを指定する必要があります。
ここでの私の考えは、あなたがメモ帳++にファイルを保存するときですそれは バイトオーダーマーク したがって、ブラウザは、これからUTF8であると推測できます。それ以外の場合は、DTDのように、XMLなどのように、ブラウザに文字を明示的に伝える必要があります。