2009-09-16 6 views
4

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

+0

Привет. Возможно, если вы покажете нам извлечение кода, который вы используете для извлечения строк из базы данных, это может помочь. И что это за база данных? MS SQL? – CraftyFella

+0

Этот вопрос некогерентен. Что же такое «кодированный UTF 8»? –

ответ

12
Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s)) 

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

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

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

+0

getBytes (s)) должны быть GetBytes (s)) – o3o

+0

@ o3o: thanks, nitfixed. – bobince

1

Я использую sql-сервер, и все столбцы nvarchar. Данные были импортированы с дампом mysql из db, который был latin1, а не utf8. Таким образом, все строки unicode кодируются только латинскими. В любом случае, я понял, и это очень похоже на то, что вы предложили. вот что я сделал, чтобы преобразовать utf8 с кодировкой latin1 в 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))); 
+2

Я не уверен, что точка второй линии. Кодировать как UTF-8, перекодировать в cp1251 (почему не только GetBytes в кодировке 1251 в первую очередь?), То получите строку Unicode из этих байтов? Все это сделает, это отфильтровать любые символы, отсутствующие в 1251, из вашей строки Unicode. int: http://msdn.microsoft.com/en-us/library/wzsz3bk3.aspx – bobince

Смежные вопросы