Преобразование строки из CP866 в UTF8 - PullRequest
0 голосов
/ 14 мая 2018

У меня есть база данных (MSSQL), и в ней есть таблица с переводами для названий продуктов.Один из языков русский.

Пример записи базы данных ¸ą¤®åą Øā «ģ с использованием универсального кириллического декодера Мне удалось выяснить, что это Прдохранитль, а также что исходная кодировка CP866и мне нужно, чтобы получить WIndows-1257 или utf-8.

Как это сделать в C #?

Я пробовал что-то вроде

string line = "¸ą¤®åą ­Øā«ģ";

Encoding cp866 = Encoding.GetEncoding("CP866");
Encoding w1257 = Encoding.GetEncoding("windows-1257");
byte[] cp866Bytes = cp866.GetBytes(line);
byte[] w1257Bytes = Encoding.Convert(cp866, w1257, cp866Bytes);
var lineFinal = w1257.GetString(w1257Bytes);

Может ли кто-нибудь мне помочь?

Результат для данного кода: ?a?¤Raa -Oa?<g

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Оставляя в стороне вопросы о том, как такая строка может в конечном итоге оказаться в базе данных, вы можете преобразовать ее следующим образом:

string line = "¸ą¤®åą ­Øā«ģ";
Encoding w1257 = Encoding.GetEncoding("windows-1257");
Encoding cp866 = Encoding.GetEncoding("CP866");            
var lineFinal = cp866.GetString(w1257.GetBytes(line));

Поскольку ваша исходная строка использует кодовую страницу 1257, и вам нужноCP866.

Обратите внимание, что эта конкретная строка является сильно поврежденной, она приводит к Предохр нитель и правильному слову Предохранитель (поэтому вместо индекса а вместо индекса 8 у нас есть пробел).Однако оригинальная строка также содержит пробел в этой позиции, поэтому этот ущерб не является результатом декодирования (возможно, вы просто неправильно скопировали ее в вопрос).

0 голосов
/ 14 мая 2018

Ваша проблема в том, что вы делаете это наоборот.line не показывает кириллицу.Символы, на которые вы смотрите, являются Windows-1257 символами.Когда вы сохраняете строку как кодировку, вы сопоставляете символы с этой кодировкой, а не интерпретируете их как эту кодировку, что означает, что это только приведет к ее дальнейшему повреждению.

Также поймите, что текст в .Net не имеет кодировки (или, в любом случае, кодировка не нужна заботе ).String - это просто String, серия символов Юникода.Кодировка становится релевантной только тогда, когда вам это нужно в байтах.

Поскольку мы знаем, что эти символы в кодировке Windows-1257 будут содержать правильные значения байтов, необходимые для их просмотра в CP866, но при этомв тот момент, когда они являются чисто-Unicode String и , а не Windows-1257, вам нужно сначала преобразовать его в windows-1257 байтов, а затем интерпретировать этих байтовкак CP866.

String line = "¸ą¤®åą ­Øā«ģ";
Encoding cp866 = Encoding.GetEncoding("CP866");
Encoding w1257 = Encoding.GetEncoding("windows-1257");
Byte[] w1257Bytes = w1257.GetBytes(line);
String lineFinal = cp866.GetString(w1257Bytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...