C#中文编码/网络
我有一个客户机/服务器体系结构,在其中以文本格式交换消息 例如:C#中文编码/网络,c#,networking,character-encoding,chinese-locale,C#,Networking,Character Encoding,Chinese Locale,我有一个客户机/服务器体系结构,在其中以文本格式交换消息 例如: 12 2013/11/11 abcd 5 ^ ^ ^ ^ int date text int “正常”文本一切正常。 现在这是一个中国项目,所以他们也想发送中国符号。编码GB18030或GB2312 我是这样读数据的: char[] dataIn = binaryReader.ReadChars(length); 然后,我从char数组创建一个新字符串,并将其转换为正确的数据
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);
此外,列数据类型必须是nvarchar而不是varchar。此anser由我自己的评论“升级”(根据原始海报的要求)
在.NET Framework中,字符串已经是Unicode字符串
(不过,不要通过写入控制台来测试Unicode字符串,因为终端窗口和控制台通常不会正确显示它们。但是,由于.NET 4.5版,因此对此有一些支持。)
当您从外部源获取文本时,需要注意的是编码。在这种情况下,BinaryReader
的构造函数提供了一个重载,该重载接受编码
:
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注入。)
列的默认排序规则将是数据库的排序规则(SQL\u Latin1\u General\u CP1\u CI\u AS
)。除非您按该列或类似内容排序,否则这可能没问题。如果您按此列进行排序,请考虑为该列(或整个数据库)使用一些中文排序规则。您查看了“@ HeTrLeLeCter”-只需使用所需的编码读取数据。这通常表示您也在消息中存储了此信息。BinaryReader
类提供了构造函数,您可以在其中提供编码。您是否尝试过类似于的新二进制读取器(inputStream,Encoding.GetEncoding(“GB18030”))
?不要使用标准控制台进行测试。简单的.NET字符串(没有代理项对或任何东西),如string str1=“123东北特钢大连新基地测试”
或字符串str2=DateTime.Today.ToString(“D”,新文化信息(“zh CN”)使用控制台无法很好地打印code>。WriteLine
。不过,您可以在调试期间看到字符串的值。不要将UTF-16(或Encoding.Unicode
)与GB 18030混用。当您从源代码“读取”时,请将BinaryReader
设置为我最新评论中建议的正确编码。剩下的时间里,不要做什么特别的事情,只需信任.NET Framework和SQL Server。相关的数据库列必须有一个带有首字母n
的类型,例如使用nvarchar
而不是varchar
,或者使用ntext
而不是text
。与常量字符串进行比较时,请使用N'123东北'代码>在节拍前加上大写字母N
,而不仅仅是'123东北'代码>。