2013-06-03 5 views
-1

У меня есть архитектура Client/Server, где обмениваются сообщения в текстовом формате.C# chinese Encoding/Network

Например:

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

Все отлично работает с "нормальным" текстом. Теперь это китайский проект, поэтому они также хотят отправить китайские символы. Кодирование GB18030 или GB2312.

Я читать данные таким образом:

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

тогда я создать новую строку из массива полукокса и преобразовать его в правильный тип данных (INT, поплавка, строки и т.д.).

Как я могу изменить/включить китайское кодирование или преобразовать значения строк в китайский? И что было бы хорошо & простой способ проверить это. Спасибо.

Я пытался использовать что-то вроде этого

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); 

Кроме того, data data column должен быть nvarchar вместо varchar.

+0

Вы ознакомились с классом ['Encoding'] (http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx)? – Oded

+0

@HectorLector - просто прочитайте данные, используя требуемую кодировку. Обычно это указывает на то, что вы храните эту информацию и в сообщении. –

+1

Класс 'BinaryReader' предлагает конструкторы, в которых вы указываете' Encoding'. Вы пытались что-то вроде «new BinaryReader (inputStream, Encoding.GetEncoding (« GB18030 »))?? –

ответ

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). В противном случае, в зависимости от сортировки, столбец может не иметь возможности содержать общие символы Юникода (он может быть представлен внутренне с помощью 8-разрядной кодовой страницы Microsoft).

Всякий раз, когда вы даете nchar буквальным в SQL, используйте формат N'my text', а не только 'my text', чтобы убедиться, что в буквальном смысле интерпретируется как nchar, а не просто char. Например, N'Erdős' отличается от N'Erdos', тогда как во многих сопоставлениях 'Erdős' и 'Erdos' могут быть (проецированы) на то же значение на исходной кодовой странице.

Аналогичным образом N'东北特钢大连新基地' будет работать, а '东北特钢大连新基地' может привести к множеству вопросительных знаков. С обновлением вашего quetion:

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

(Это склонное к инъекции SQL, конечно.)

по умолчанию параметров сортировки вашей колонки будет у вашей базы данных (SQL_Latin1_General_CP1_CI_AS от Вашего комментария). Если вы не найдете ORDER BY, то эта колонка, или аналогичная, будет, вероятно, в порядке. Если вы делаете do, закажите этот столбец, попробуйте использовать некоторую сортировку китайского языка для столбца (или для всей базы данных).