Преобразование символов UCS-2 в UTF-8 с использованием C # - PullRequest
1 голос
/ 29 декабря 2010

Я вытаскиваю некоторый интернационализированный текст из базы данных MS SQL Server 2005.Согласно значениям по умолчанию для этой БД символы сохраняются как UCS-2.Однако мне нужно вывести данные в формате UTF-8, так как я отправляю их через Интернет.В настоящее время у меня есть следующий код для преобразования:

SqlString dbString = resultReader.GetSqlString(0);
byte[] dbBytes = dbString.GetUnicodeBytes();
byte[] utf8Bytes = System.Text.Encoding.Convert(System.Text.Encoding.Unicode, 
    System.Text.Encoding.UTF8, dbBytes);
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
string outputString = encoder.GetString(utf8Bytes);

Однако, когда я проверяю вывод в браузере, он выглядит как мусор, независимо от того, какую кодировку я установил.

Что мне не хватает?

РЕДАКТИРОВАТЬ: В ответ на ответы ниже, я подумал, что мне пришлось выполнить преобразование, потому что я могу вывести буквально многобайтовые строки очень хорошо.Например:

OutputControl.Text = "カルフォルニア工科大学とチューリッヒ工科大学は共同で、太陽光を保管可能な燃料に直接変えることのできる装置の開発に成功したとのこと";

работает.Здесь OutputControl является литералом ASP.Net.Однако

OutputControl.Text = outputString; //Output from above snippet

приводит к искаженному выводу, как описано выше.Моя гипотеза состояла в том, что ASP.Net вывод базы данных каким-то образом искажается.Если это не так, то каковы другие возможности?

РЕДАКТИРОВАТЬ 2: Хорошо, я тупой.Оказывается, с базой данных все в порядке.Когда я попытался вставить свои собственные буквенные двухбайтовые символы (材料,原料;木料), я мог читать и выводить их очень хорошо, даже без какого-либо процесса преобразования вообще.Мне кажется, что то, что вставляет данные в БД, каким-то образом искажает символы, так что я собираюсь посмотреть на это.С моими проверенными «чистыми» данными работает следующий код:

OutputControl.Text = dbString.ToString();

, как показывают ответы ниже.

Ответы [ 2 ]

4 голосов
/ 29 декабря 2010

Ваш код по сути такой же, как:

SqlString dbString = resultReader.GetSqlString(0);
string outputString = dbString.ToString();

string сама по себе является строкой UNICODE (в частности, UTF-16, которая «почти» совпадает с UCS-2, за исключением кодовых точек, не вписывающихся в младшие 16 бит). Другими словами, выполняемые вами преобразования являются избыточными.

Скорее всего, ваше веб-приложение исправляет кодировку в другом месте или устанавливает неправильную кодировку для вывода HTML. Однако это не может быть диагностировано на основании предоставленной вами информации.

0 голосов
/ 29 декабря 2010

Строка в .net является «независимой от кодирования».

Вы можете преобразовать байтов в строку , используя определенную кодировку, чтобы сообщить .net, как интерпретировать ваши байты.

Вы можете преобразовать строку в байтов , используя определенную кодировку, чтобы сообщить .net, как вы хотите, чтобы ваши байты обслуживались.

Но попытка преобразовать строку в другую строку с использованием кодировок не имеет никакого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...