【问题标题】:UTF-8 encoding when reading from database (C#)从数据库读取时的 UTF-8 编码 (C#)
【发布时间】:2016-05-13 20:04:40
【问题描述】:

我有一个从数据库读取数据并将其输出到文本文件的 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"));

...完美运行。

Signed 8-bit 2’s-compliment

rdr[i].toString() 可能是问题所在吗?我的猜测是,当它将对象转换为字符串时,它会破坏’ 字符的编码,这使我无法将其正确转换为撇号。但我认为我不能避免在那里使用toString()。那我该怎么办?

【问题讨论】:

    标签: c# database encoding utf-8


    【解决方案1】:

    问题的根源在于数据库端。假设是 SQL Server,请查看有关 Collation and Unicode Support 的链接。基本上,您的数据可能不会以您想的格式返回。

    一般来说,SQL 支持 UTF-16,而不是 UTF-8 - 所以只要正确返回数据,ToString() 应该正确解码它,因为 .NET 字符串的格式为 UTF-16。

    另外,如果您不特别关心该特定字符,您可以更新您的数据库记录并为该行文本设置一个“正常”撇号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 2015-08-13
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2018-01-27
      相关资源
      最近更新 更多