【问题标题】:Converting problem ANSI to UTF8 C#将问题 ANSI 转换为 UTF8 C#
【发布时间】:2011-04-16 05:57:17
【问题描述】:

在 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);
    }

你知道为什么会这样吗?

【问题讨论】:

  • ASCII 是无代码页的 7 位编码,正如 Andrey 解释的那样。如果它有重音字符,则不应使用 ASCII。

标签: c# encoding utf-8 ansi


【解决方案1】:

你知道为什么会这样吗?

是的,你来晚了。从文件中读取字符串时需要指定 ANSI。在内存中它始终是 Unicode (UTF16)。

【讨论】:

  • +1 是的,文本在进入函数之前就已经被销毁了。
【解决方案2】:

当您转换为 ASCII 时,您会立即丢失所有非英文字符(包括带重音的字符),因为 ASCII 只有 127 个(7 位)字符。

你做了奇怪的操纵。 .net 中的 string 是 UTF-16,所以一旦你返回 string,而不是 byte[],这没关系。

我认为你应该这样做:(我猜 ANSI 你的意思是 Latin1)

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

由于问题不是很清楚,有一个合理的说法是你可能真的需要这个:

public string Decode(byte[] data)
{
    return Encoding.GetEncoding(1252).GetString(data);
}

【讨论】:

  • +1 用于 CodePage 的东西,但我认为你的方向是错误的。 Op 需要读取byte[] 和一个将其转换为 string 的函数。
  • @Henk Holterman 我感觉我误解了提问者。但他的函数接受string 并返回string 所以我不确定
  • @Henk Holterman string Decode(byte[]) 是什么?我不知道这个方法。 GetByte返回给定编码的字节,有什么问题?
【解决方案3】:

这可能是最简单的方法:

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);

【讨论】:

  • 这是如何工作的? GetString() 是否检测输入文件中使用了哪种编码?或者它只是因为 UTF-8 代码点正确映射到 Latin1 代码页而起作用?
【解决方案4】:

我建议阅读此http://www.joelonsoftware.com/articles/Unicode.html
如果要读取 ASCII 文件,则需要知道文件的代码页。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      我的想法是,当您在 Notepad++ 中保存文件时,它会插入 Byte-Order-Mark,因此浏览器可以从中推断出它是 UTF8。否则,您可能必须明确告诉浏览器字符编码,如在 DTD、XML 等中。

      【讨论】:

        【解决方案7】:

        另外,您可以尝试以下方法。 我已通过在文件中使用记事本+ 更改了类型。
        (编码->转换为 UTF-8)
        它对我有用。

        【讨论】:

          猜你喜欢
          • 2011-05-22
          • 1970-01-01
          • 2016-02-10
          • 1970-01-01
          • 2013-12-15
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多