【问题标题】:Converting file encoding from ebcidic to Unicode将文件编码从 ebcidic 转换为 Unicode
【发布时间】:2021-07-07 08:55:06
【问题描述】:

我有一个 EBCDIC 格式的文件,需要将其转换为 Unicode 格式,因为它包含一些外语字符。

【问题讨论】:

  • "Unicode" 并不是真正的文件格式——最常见的基于 Unicode 的文件格式是 UTF-8(有或没有 BOM)。也许这有帮助:jonskeet.uk/csharp/ebcdic
  • 我尝试从提到的文章中获得帮助。当我手动更改原始文件编码时,“‰”之类的字符将更改为“0X89”(请注意,我使用 Notepad++ 打开这些文件,默认格式为 ANSI,我手动选择编码 UTF-8),但是当我尝试使用上述程序,它是“i”。我想我错过了一些东西。请帮忙。
  • 您必须区分字节(编码)和字符。文件由字节组成;编码决定了这些如何被解释为字符。在 EBCDIC 中,例如字节 0x89 对应于字符“i”。相同的字节 0x89 在 Windows-1252 中是“‰”。
  • 我明白,但是当我第一次转换文件然后尝试替换字节时,原始文件中的某些特殊字符不会更改/丢失。我想知道我的方法应该是先读取原始文件,替换上面的字节然后更改编码。但这也矛盾,因为当我打开文件时,它将有符号而不是十六进制。所以我在这里理解的是我应该先尝试以十六进制格式读取文件,替换字节然后更改编码。这是一个正确的方法吗?
  • 大家好,我在主要问题之后有疑问。我的输出文件应该显示中文和英文字符,但我只能显示英文?我在这里缺少什么?

标签: c# unicode encoding


【解决方案1】:

您需要做的第一件事是找出用于对 EBCDIC 文件进行编码的代码页。美国 EBCDIC 代码页是 1137,但既然你说文件中有外来字符,那可能不是用的。

在此示例中,我使用了代码页 1142,它是北欧 EBCDIC 代码页。我已将一些 EBCDIC 字符放入字节数组中。然后我将字节数组拆分为每 0x09 字节的行,并将每一行转换为 C# 字符串。 C# 字符串是 unicode,因此您应该可以轻松地将它们写入新文件。

我希望你可以以此为起点。

    static void Main(string[] args)
    {
        byte[] inputFile = new byte[] { 0x81, 0x82, 0x83, 0x09, 0xc0, 0x6a, 0xd0 }; 
        IEnumerable<byte[]> ebcdicLines = SplitBytes(inputFile);
        Encoding encoding = CodePagesEncodingProvider.Instance.GetEncoding(1142); // Codepage 1142 is nordic EBCDIC
        IEnumerable<string> lines = ebcdicLines.Select(l => encoding.GetString(l)); // Convert each line to string (unicode)
        foreach (var line in lines)
        {
            Console.WriteLine(line);
        }
    }

    static IEnumerable<byte[]> SplitBytes(byte[] bytes)
    {
        int currentIndex = 0;
        int newlineIndex = Array.IndexOf(bytes, (byte)0x09, currentIndex);
        while (newlineIndex > -1)
        {
            yield return bytes.Skip(currentIndex).Take(newlineIndex - currentIndex).ToArray();
            currentIndex = newlineIndex + 1;
            newlineIndex = Array.IndexOf(bytes, (byte)0x09, currentIndex);
        }
        yield return bytes.Skip(currentIndex).ToArray();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2021-12-26
    • 1970-01-01
    • 2010-11-28
    • 2016-07-07
    • 2010-11-06
    相关资源
    最近更新 更多