2016-05-13 2 views
0

У меня есть программа на C#, которая считывает данные из базы данных и выводит ее в текстовый файл.Кодирование UTF-8 при чтении из базы данных (C#)

OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + tableName, conn); 
OleDbDataReader rdr = cmd.ExecuteReader(); 

if (rdr.HasRows) 
{ 
    while (rdr.Read()) 
    { 
     for (int i = 0; i < rdr.FieldCount; i++) 
     { 
      string toStr = rdr[i].ToString(); 

      // ...etc. 

Одна линия, в частности, не дает мне проблем. Вот как это выглядит в базе данных:

Signed 8-bit 2’s-compliment 

Вот как это выглядит в моем выходном файле:

Signed 8-bit 2’s-compliment 

я понял, что я мог бы исправить это, принимая во внимание кодировку. Поэтому я изменил код, чтобы преобразовать текст в UTF-8:

string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rdr[i].ToString())); 

что приводит:

Signed 8-bit 2�s-compliment 

Однако, если я делаю ЭТО ...

string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes("Signed 8-bit 2’s-compliment")); 

.. .it работает отлично.

Signed 8-bit 2’s-compliment 

Может ли проблема rdr[i].toString()? Я предполагаю, что когда он преобразует объект в строку, он закручивает кодировку символа ’, что мешает мне правильно преобразовать его в апостроф. Но я не думаю, что могу избежать использования toString(). Итак, что мне делать?

ответ

0

Корень проблемы находится на конце базы данных. Предполагая, что SQL Server, взгляните на эту ссылку относительно Collation and Unicode Support. В принципе, ваши данные могут не возвращаться в формате, о котором вы думаете.

В общем, SQL поддерживает UTF-16, а не UTF-8 - при условии, что данные вернутся правильно, ToString() должен правильно декодировать его, так как строки .NET отформатированы UTF-16.

Кроме того, если вы не особенно заботитесь об этом конкретном символе, вы можете просто обновить запись базы данных и установить «нормальный» апостроф для этой строки текста.

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