将ANSI数据转换为Unicode

时间:2011-10-30 08:06:38

标签: .net utf-8 compact-framework windows-ce codepages

我有一个通过编码1256保存的文本文件 至于我的设备上的Windows CE 5.0不支持该代码页,我无法通过.NET CF中的编码打开文件,但操作系统支持Unicode。 (我在表单中显示了一些硬代码字符串) 我怎样才能读取该文件并将其数据转换为Unicode?
如何将单个字符转换为其UTF8等效字节? THIS LINK表示在1256代码页表中,字符编号200 / C8为0x0628。那么它们之间的关系是什么?如果我有200 / C8,我怎么能得到0x0628?

1 个答案:

答案 0 :(得分:3)

最简单的方法就是自己对转换进行硬编码 - 创建256个值的char[],用相同的数字填充前128个位置,然后手动填充其余的位置。它们之间的“关系”不是你可以用数学方法得到的 - 它只是一个有点任意的值分配

例如:

private static readonly char[] CodePage1256 = GenerateCodePage1256();

private static readonly char[] GenerateCodePage1256()
{
    char[] ret = new char[256];
    for (int i = 0; i < 128; i++)
    {
        ret[i] = (char) i;
    }
    string upperCharacters =
        "\u20ac\u067e\u201a\u0192\u201e\u2026\u2020\u2021" +
        "\u02c6\u2030"; // etc - from the Wikipedia page

    for (int i = 0; i < 128; i++)
    {
        ret[i + 128] = upperCharacters[i];
    }
}

然后您有一个直接的bytechar映射。当然,这是一个可能容易出错的过程 - 另一种可能性是在 拥有该代码页的系统上创建带有映射的文件。

无论如何,一旦你有了映射,就可以轻松地将任何字节数组转换为字符串或char数组,此时你可以使用普通的.NET类将文件再次写为UTF-8。例如:

using (Stream input = File.Open("input.txt"))
{
    using (StreamWriter output = File.CreateText("output.txt"))
    {
        byte[] byteBuffer = new byte[8 * 1024];
        char[] charBuffer = new char[byteBuffer.Length];
        int bytesRead;

        while ((bytesRead = input.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
        {
            for (int i = 0; i < bytesRead; i++)
            {
                charBuffer[i] = CodePage1256[byteBuffer[i]];
            }
            output.Write(charBuffer, 0, bytesRead);
        }
    }
}