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东北'