конвертировать данные ANSI в Unicode - PullRequest
1 голос
/ 30 октября 2011

У меня есть текстовый файл, сохраненный с помощью кодировки 1256.
, поскольку мой Windows CE 5.0 на моем устройстве не поддерживает эту кодовую страницу, я не могу открыть файл с этой кодировкой в ​​.NET CF, но в ОСподдерживает Unicode.(я показал несколько строк жесткого кода в своей форме), как я могу прочитать этот файл и преобразовать его данные в Unicode?
как я могу преобразовать один символ в его байты, эквивалентные UTF8?1005 * говорит, что в таблице кодовых страниц 1256 номер символа 200 / C8 равен 0x0628.так какова связь между ними?если у меня есть 200 / C8, как я могу получить 0x0628?

1 Ответ

3 голосов
/ 30 октября 2011

Вероятно, было бы проще просто жестко закодировать преобразование самостоятельно - создать char[] из 256 значений, заполнить первые 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];
    }
}

Тогда у вас есть прямое отображение byte на 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);
        }
    }
}
...