c# - 使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

标签 c# utf-8 iso-8859-1 latin1

我正在发送保存在 ISO 88591-1 中的文本文件包含来自 Latin-1 范围的重音字符(以及正常的 ASCII a-z 等)的格式。如何将这些文件转换为 UTF-8使用 C# 以便 ISO 8859-1 中的单字节重音字符成为有效的 UTF-8 字符?

我尝试使用带有 ASCIIEncoding 的 StreamReader,然后通过实例化编码 ascii 和编码 utf8 然后使用 将 ASCII 字符串转换为 UTF-8 Encoding.Convert(ascii, utf8, ascii.GetBytes( asciiString) ) — 但重音字符呈现为问号。

我错过了什么步骤?

最佳答案

您需要获得正确的Encoding 对象。 ASCII顾名思义:ASCII,意思是它只支持7位的ASCII字符。如果您想做的是转换文件,那么这可能比直接处理字节数组更容易。

using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName,
                                       Encoding.GetEncoding("iso-8859-1")))
{
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(
                                           outFileName, Encoding.UTF8))
    {
        writer.Write(reader.ReadToEnd());
    }
}

但是,如果您想自己拥有字节数组,使用 Encoding.Convert 就足够了。

byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
    Encoding.UTF8, data);

然而,这里需要注意的是,如果您想走这条路,那么您应该为您的文件使用基于编码的字符串阅读器,例如 StreamReader IO。 FileStream 会更适合,因为它将读取文件的实际字节。

为了全面探索这个问题,像这样的东西会起作用:

using (System.IO.FileStream input = new System.IO.FileStream(fileName,
                                    System.IO.FileMode.Open, 
                                    System.IO.FileAccess.Read))
{
    byte[] buffer = new byte[input.Length];

    int readLength = 0;

    while (readLength < buffer.Length) 
        readLength += input.Read(buffer, readLength, buffer.Length - readLength);

    byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
                       Encoding.UTF8, buffer);

    using (System.IO.FileStream output = new System.IO.FileStream(outFileName,
                                         System.IO.FileMode.Create, 
                                         System.IO.FileAccess.Write))
    {
        output.Write(converted, 0, converted.Length);
    }
}

在本例中,buffer 变量被文件中的实际数据填充为 byte[],因此没有进行任何转换。 Encoding.Convert 指定源和目标编码,然后将转换后的字节存储在名为...converted 的变量中。然后将其直接写入输出文件。

就像我说的,如果这就是您所做的全部,那么使用 StreamReaderStreamWriter 的第一个选项会简单得多,但后一个示例应该给您更多关于实际情况的提示。

关于c# - 使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595442/

相关文章:

c# - 首先在 EF6 db 中模拟数据库

c# - 在按键事件中将 TextBox 对齐到页面中间

php - 字符编码在某一点丢失

java - 从 Java 中的字符串中过滤非 MySQL Latin1 字符

javascript - "ISO-8859-1"JavaScript 中的编码

c# - 拆分xml文件并保留父节点信息

c# - 同时处理数千个数据库调用

php - 数据库中的 utf8 - 在 php.ini 中设置 default_charset

java - 将 Tomcat 5.5 配置为 UTF-8 对所有 sendRedirect() 重定向进行编码?

actionscript-3 - 有什么方法可以将ActionScript 3中的常规字符串转换为Latin-1字符代码的ByteArray?