我有一个客户端/服务器架构,其中交换了文本格式的消息。
例如:
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。
答案 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
)类型,而不仅仅是varchar
(char
) 。否则,根据排序规则,该列可能无法保存常规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}}那个列或类似的列可能没问题。如果您按此列执行订购,请考虑对该列(或整个数据库)使用一些中文语言排序规则。