2013-06-03 2 views
-1

텍스트 형식의 메시지를 교환하는 클라이언트/서버 아키텍처가 있습니다.C# 중국어 인코딩/네트워크

예를 들어

:

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

또한 dataType 열은 varchar 대신 nvarchar 여야합니다.

+0

['Encoding' 클래스] (http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx)를 보셨습니까? – Oded

+0

@HectorLector - 필요한 인코딩을 사용하여 데이터를 읽습니다. 이것은 일반적으로이 정보를 i 메시지에 저장한다는 의미입니다. –

+1

'BinaryReader' 클래스는 여러분이'Encoding '을 제공하는 생성자를 제공합니다. '새로운 BinaryReader (inputStream, Encoding.GetEncoding ("GB18030"))'같은 것을 시도 했습니까? –

답변

1

이 anser는 (직접 작성한 포스터의 요청에 따라) 의견을 통해 "승격"됩니다.

.NET Framework에서 문자열은 이미 유니 코드 문자열입니다.

(터미널 창과 콘솔에는 일반적으로 올바르게 표시되지 않으므로 콘솔에 쓰는 방식으로 유니 코드 문자열을 테스트하지 마십시오. 그러나 .NET 버전 4.5부터는 약간의 지원이 있습니다.)

외부 소스에서 텍스트를 가져올 때주의해야 할 사항은 Encoding입니다. 이 경우, BinaryReader의 생성자가 Encoding에 걸리는 과부하 제공 : SQL 서버에

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

을, 중국 문자열을 보유 할 필요가있는 열 유형 nvarchar (또는 nchar)로되어 있는지 확인하지 수 단지 varchar (char). 그렇지 않으면 데이터 정렬에 따라 열이 일반 유니 코드 문자를 보유하지 못할 수도 있습니다 (일부 8 비트 Microsoft 코드 페이지에서 내부적으로 표현할 수 있음).

은 때마다 당신은 SQL의 nchar 리터럴, 리터럴은 nchar보다는 char로 해석됩니다 확인하기 위해, 형식 N'my text' 아니라 'my text'을 사용하여 제공합니다. 예를 들어 N'Erdős'N'Erdos'과 구별되는 반면, 많은 데이터 정렬에서 'Erdős''Erdos'은 기본 코드 페이지의 동일한 값으로 (투영 될 수 있습니다.)

마찬가지로 N'东北特钢大连新基地'이 작동하고 '东北特钢大连新基地'은 많은 물음표를 유발할 수 있습니다.

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

(이것은 물론, SQL 주입하는 경향이있다.) (귀하의 코멘트에서 SQL_Latin1_General_CP1_CI_AS)

당신의 열의 기본 데이터 정렬이 데이터베이스의 될 것입니다 : 당신의 quetion의 업데이트에서. 당신이 ORDER BY 그 칼럼이나 그와 비슷한 것이 아니라면 아마 괜찮을 것입니다. 이이 열별로 주문을 수행하는 경우 열 (또는 전체 데이터베이스)에 대한 중국어 데이터 정렬을 사용해보십시오.