Строка UTF-8 в C # из DataReader - PullRequest
       0

Строка UTF-8 в C # из DataReader

0 голосов
/ 21 февраля 2012

У меня есть запрос MS SQL, который возвращает поле в кодировке UTF-8 (varchar). Как мне преобразовать его в строку .NET Unicode? UTF8Encoding.GetString выполнит эту работу ... если у вас есть массив байтов - у меня нет.

Ответы [ 4 ]

3 голосов
/ 06 августа 2012

Если у вас есть C # string, чье содержимое неправильно интерпретируется как кодированное в UTF-16, вы можете переосмыслить базовые байты:

public static string InterpretAsUTF8(string value)
{
  byte[] rawData = Encoding.Default.GetBytes(value);
  string reencoded = Encoding.UTF8.GetString(rawData);
  return reencoded;
}

Однако, если у вас есть доступ к SqlDataReader, тогда, как предложено @ CarlSteffen , вы можете сделать это:

//Assuming the column index you're interested in is 1:
SqlString utf8EncodedString = reader.GetSqlString(1);
string expectedResult = Encoding.UTF8.GetString(utf8EncodedString.GetNonUnicodeBytes());
3 голосов
/ 20 июня 2012

Я адаптировал то, чему научился на форумах MSDN . Запрос возвращает varchar с текстом в кодировке UTF-8, значениями datetime и int. Я строю файл CSV из результатов.

using (var sw = new StreamWriter(txtOutputFile, true, Encoding.UTF8))
{
  while (r.Read())
  {
    var colCount = r.FieldCount;
    var curCol = 1;

    var utf8 = new UTF8Encoding();
    var row = "";

    if (r[0].GetType() == typeof(SqlString))
    {
      SqlString sqlString = r.GetSqlString(0);
      Byte[] encodedBytes = sqlString.GetNonUnicodeBytes();
      row = "\"" + utf8.GetString(encodedBytes) + "\"";
    }
    else
    {
      row = "\"" + r[0].ToString() + "\"";
    }

    while (curCol < colCount)
    {
      if (r[curCol].GetType() == typeof(SqlString))
      {
        SqlString sqlString = r.GetSqlString(curCol);
        Byte[] encodedBytes = sqlString.GetNonUnicodeBytes();
        row += ",\"" + utf8.GetString(encodedBytes) + "\"";
      }
      else
      {
        row += ",\"" + r[curCol].ToString() + "\"";
      }
      curCol += 1;
    }

    sw.WriteLine(row);
  }

}
1 голос
/ 21 февраля 2012

Хорошая начальная точка: http://msdn.microsoft.com/en-us/library/kdcak6ye.aspx Чтобы получить байты исходной строки, вы можете использовать метод System.Text.Encoding.UTF8.GetBytes().

0 голосов
/ 21 февраля 2012

Адаптировал возможное решение из этого вопроса: C # Преобразование строки из UTF-8 в ISO-8859-1 (Latin1) H

var dbEnc = Encoding.UTF8;
var uniEnc = Encoding.Unicode;
byte[] dbBytes = dbEnc.GetBytes(dbString);
byte[] uniBytes = Encoding.Convert(dbEnc, uniEnc, dbBytes);
string msg = uniEnc.GetString(uniBytes);

Помогает ли это?

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