C # Encoding. Преобразование латиницы в иврит - PullRequest
6 голосов
/ 30 августа 2011

Я пытаюсь получить и проанализировать онлайн-документ Excel, который написан на иврите, но, к сожалению, в не-иврите.

В качестве примера я пытаюсь преобразовать следующую строку: "âìéåï_1", которая служит именем первого листа для иврита с использованием кода C #, но я не могу этого сделать.

Я знаю, что вышеупомянутое является конвертируемым, так как, когда я открываю его в NotePad ++ и выбираю Кодировка / Наборы символов / Иврит / Windows 1255, я вижу: «גליון_1», который является правильным представлением на иврите вышеуказанной строки. *

Я использую код ниже

            string str = "âìéåï_1";

            Encoding windows = Encoding.GetEncoding("Windows-1255");
            Encoding ascii = Encoding.GetEncoding("Windows-1252");
            byte[] asciiBytes = ascii.GetBytes(str);
            byte[] windowsBytes = Encoding.Convert(ascii, windows, asciiBytes);

            char[] windowsChars = new char[windows.GetCharCount(windowsBytes, 0, windowsBytes.Length)];
            windows.GetChars(windowsBytes, 0, windowsBytes.Length, windowsChars, 0);
            string windowsString = new string(windowsChars);

Я предположил, что кодировка исходной строки - Windows-1252, поскольку при вставке в NotePad ++ и изменении кодировки на Windows-1252 строка остается прежней ...

Я, вероятно, что-то здесь не так, кто-нибудь знает, как правильно конвертировать вышеупомянутое?

Спасибо

Mikey

1 Ответ

16 голосов
/ 30 августа 2011
const string Str = "âìéåï_1";

Encoding latinEncoding = Encoding.GetEncoding("Windows-1252");
Encoding hebrewEncoding = Encoding.GetEncoding("Windows-1255");

byte[] latinBytes = latinEncoding.GetBytes(Str);

string hebrewString = hebrewEncoding.GetString(latinBytes);

hebrewString:

גליון_1

В приведенном вами примере «Window-1252» не является фактически ASCII, это расширенный ASCII и по какой-то причинеEncoding.Convert с этими двумя кодировками невозможно преобразовать расширенный диапазон ASCII, поэтому все +127 символов преобразуются как 63 (то есть?).При «преобразовании» из одного расширенного символа байта ASCII [] в другой, я ожидал бы, что байты будут одинаковыми, только когда вы преобразуете их в строку Unicode .Net, я ожидаю, что они будут разными.Не уверен, почему Convert конвертирует +127 символов в '?'.

...