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,所以一旦你 return 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++ 中时,它会插入字节顺序标记,因此浏览器可以从中推断出它是 UTF8。否则,您可能必须明确告诉浏览器字符编码,如 DTD、XML 等。

于 2010-09-23T12:19:43.827 回答
0

这可能是因为您的原件string text已经包含无效字符。仅当您的输入是字节数组时,编码转换才有意义。因此,您应该将文件读取为字节数组而不是字符串,或者如 Henk 所说,指定读取文件的编码。

于 2010-09-23T12:22:37.503 回答
0

另外,您可以尝试以下操作。我已经通过在文件中使用 notepad+ 更改了类型。
(编码-> 转换为 UTF-8)
它适用于我。

于 2020-11-30T08:49:21.037 回答