繁体   English   中英

从DataReader将UTF-8转换为C#字符串

[英]UTF-8 to C# string from a DataReader

我有一个MS SQL查询,该查询返回UTF-8编码的字段(varchar)。 如何将其转换为.NET Unicode字符串? UTF8Encoding.GetString将完成这项工作...如果您有字节数组-我没有。

我调整了从MSDN论坛中学到知识。 该查询返回一个varchar使用UTF-8编码的文本, datetimeint的值。 我正在根据结果构建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);
  }

}

如果您有一个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());

良好的起点: http : //msdn.microsoft.com/zh-cn/library/kdcak6ye.aspx要获取原始字符串的字节,可以使用System.Text.Encoding.UTF8.GetBytes()方法。

针对此问题改编了可能的解决方案: 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);

这有帮助吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM