[英]UTF-8 to C# string from a DataReader
我有一个MS SQL查询,该查询返回UTF-8编码的字段(varchar)。 如何将其转换为.NET Unicode字符串? UTF8Encoding.GetString将完成这项工作...如果您有字节数组-我没有。
我调整了从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);
}
}
如果您有一个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.