c#中的UTF8字符串变量

时间:2012-07-11 13:46:24

标签: c# postgresql utf-8

我正在使用PostgreSQL为C#桌面应用程序提供支持。当我使用 PgAdmin 查询分析器更新具有特殊字符(如版权商标)的文本列时,它可以完美地运行:

update table1 set column1='value with special character ©' where column2=1

当我在C#应用程序中使用相同的查询时,会抛出错误:

  

编码的无效字节序列

在研究了这个问题之后,我理解.NET字符串使用UTF-16 Unicode编码。

考虑:

string sourcetext = "value with special character ©";
// Convert a string to utf-8 bytes.
byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(sourcetext);

// Convert utf-8 bytes to a string. 
string desttext = System.Text.Encoding.UTF8.GetString(utf8Bytes);

此处的问题是sourcetextdesttext都被编码为UTF-16字符串。当我通过desttext时,我仍然得到例外。

我也尝试了以下但没有成功:

Encoder.GetString, BitConverter.GetString

修改:我甚至试过这个并没有帮助:

unsafe
{
  String utfeightstring = null;
  string sourcetext = "value with special character ©";
  Console.WriteLine(sourcetext);
  // Convert a string to utf-8 bytes. 
  sbyte[] utf8Chars = (sbyte[]) (Array) System.Text.Encoding.UTF8.GetBytes(sourcetext); 
  UTF8Encoding encoding = new UTF8Encoding(true, true);

  // Instruct the Garbage Collector not to move the memory
  fixed (sbyte* pUtf8Chars = utf8Chars)
  {
    utfeightstring = new String(pUtf8Chars, 0, utf8Chars.Length, encoding);
  }
  Console.WriteLine("The UTF8 String is " + utfeightstring); 
}

.NET中是否支持存储UTF-8编码字符串的数据类型?是否有其他方法来处理这种情况?

3 个答案:

答案 0 :(得分:5)

根据单个项目PostgreSQL中的这个页面,他们建议如果您有UTF8字符串错误,可以在连接字符串中设置编码为unicode(如果您使用的是Npgsql驱动程序):

  

编码:要使用的编码。可能的值:ASCII(默认)和UNICODE。如果您遇到UTF-8值问题,请使用UNICODE:Encoding = UNICODE

我一直在查看官方的Npgsql文档,但没有提及。 NpgsqlConnection.ConnectionString

答案 1 :(得分:-1)

我认为它可能不会由utf-8或16引起,它可能由de特殊字符引起,你可以用'& amp'的实体char替换char;

答案 2 :(得分:-1)

只需在你的ConnectionString中输入一个“......; Unicode = true”