Конвертировать кодировку UTF8 из латинского 1 в Unicode - PullRequest
4 голосов
/ 16 сентября 2009

Я наткнулся на попытку преобразовать базу данных, закодированную в UTF8, из того, как она выглядит, в кодировку Windows 1251 (не спрашивайте, но мне нужно это сделать). Все русские закодированные символы в БД отображаются как Ð ° Ð ± вгдÐ. Когда я вытаскиваю их из базы данных в свое приложение на C #, в строки, я все еще вижу, как это происходит. Независимо от того, что я пытаюсь сделать, чтобы интерпретировать эту строку как строку в кодировке UTF8, она, похоже, интерпретируется как однобайтовая строка latin1, и я не вижу, чтобы мой текст отображался как русский. Что мне в основном нужно сделать, так это преобразовать эту строку в кодировке latin1 look-utf8 в Unicode, чтобы я мог преобразовать ее позже в 1251, но я не смог сделать это успешно. У кого-нибудь есть идеи?

Ответы [ 2 ]

12 голосов
/ 16 сентября 2009
Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s))

Теперь у вас есть нормальная строка Unicode, содержащая кириллицу.

Обратите внимание, что возможно, что ваша неправильно кодированная строка "Latin-1" на самом деле может быть неправильно кодированной строкой "Windows codepage 1252"; Я не могу сказать из данного примера, поскольку он не использует символы, которые отличаются между двумя кодировками. Если это так, используйте GetEncoding(1252).

Кроме того, это предполагает, что это содержимое базы данных по вине. Если в базе данных предполагается для хранения строк UTF-8, но вы извлекаете их, как если бы они были Latin-1 (или кодовой страницей 1252 из-за того, что она является системной кодовой страницей), тогда вам действительно нужно перенастроить ваш слой доступа к данным, чтобы установить правильную кодировку. Если вы используете SQL Server, лучше начать использовать NVARCHAR.

1 голос
/ 16 сентября 2009

Я использую сервер sql, и все столбцы nvarchar. Данные были импортированы с дампом mysql из db, который был latin1, а не utf8. Таким образом, все строки Unicode просто в кодировке latin1. В любом случае, я понял это, и это очень похоже на то, что вы предложили. вот что я сделал, чтобы преобразовать кодированный из латиницы 1 utf8 в 1251.

 //re interpret latin1 in proper utf8 encoding
 str = Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(str));

 //convert from utf8 to 1251
 str = Encoding.GetEncoding(1251).GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(1251), Encoding.UTF8.GetBytes(str)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...