C#中文编码/网络

时间:2013-06-03 11:52:20

标签: c# networking character-encoding chinese-locale

我有一个客户端/服务器架构,其中交换了文本格式的消息。

例如:

12  2013/11/11  abcd  5
^     ^          ^    ^
int  date      text  int

“普通”文字一切正常。 现在这是一个中国项目,所以他们也想要发送中文符号。编码GB18030或GB2312。

我用这种方式读取数据:

char[] dataIn = binaryReader.ReadChars(length);

然后我从char数组创建一个新字符串并将其转换为正确的数据类型(int,float,string等)。

如何更改/启用中文编码,或将字符串值转换为中文? 什么是好的&简单的方法来测试这个。 感谢。

我尝试过使用类似的东西

string stringData = new string(dataIn).Trim();
byte[] data = Encoding.Unicode.GetBytes(stringData);
stringData = Encoding.GetEncoding("GB18030").GetString(data);

没有成功。

此外,我需要将一些文本值保存到MS SQL Server 2008,这是可能的 - 我需要配置一些特殊的吗?

我也试过这个例子,存储到数据库并打印到控制台,但我只是得到了????????

string chinese = "123东北特钢大连新基地testtest"; 
byte[] utfBytes = Encoding.Unicode.GetBytes(chinese); 
byte[] chineseBytes = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding("GB18030"), utfBytes); 
string msg = Encoding.GetEncoding("GB18030").GetString(chineseBytes);

修改 问题出在我发送到数据库的INSERT查询中。我在字符串前使用N'修复它。

sqlCommand = string.Format("INSERT INTO uber_chinese (columnName) VALUES(N'{0}')", myChineseString);

列dataType也必须是nvarchar而不是varchar。

1 个答案:

答案 0 :(得分:1)

这个广告是由我自己的评论“提升”(根据原始海报的要求)。

在.NET Framework中,字符串已经是Unicode字符串。

(不要通过写入控制台来测试Unicode字符串,因为终端窗口和控制台通常不会正确显示它们。但是,从.NET 4.5版本开始就有一些支持。)

当您从外部来源获取文本时,需要注意的是Encoding。在这种情况下,BinaryReader的构造函数提供了一个带有Encoding的重载:

using (var binaryReader = new BinaryReader(yourStream, Encoding.GetEncoding("GB18030")))
    ...

在SQL Server上,确保任何需要保存中文字符串的列都是nvarchar(或nchar)类型,而不仅仅是varcharchar) 。否则,根据排序规则,该列可能无法保存常规Unicode字符(它可能由某些8位Microsoft代码页在内部表示)。

每当您在SQL中提供nchar字面值时,请使用格式N'my text',而不仅仅是'my text',以确保字面值被解释为nchar而不仅仅是char N'Erdős'。例如,N'Erdos''Erdős'不同,而在许多排序规则中,'Erdos'N'东北特钢大连新基地'可能(投影到)底层代码页中的相同值。

同样'东北特钢大连新基地'可行,而sqlCommand = string.Format("INSERT INTO uber_chinese (columnName) VALUES(N'{0}')", myChineseString); ↑ 可能会产生大量问号。从更新您的队列:

SQL_Latin1_General_CP1_CI_AS

(当然,这很容易引入SQL。)

列的默认排序规则将是数据库的默认排序规则(评论中为ORDER BY)。除非你{{1}}那个列或类似的列可能没问题。如果您按此列执行订购,请考虑对该列(或整个数据库)使用一些中文语言排序规则。