-1

テキスト形式のメッセージが交換されるクライアント/サーバー アーキテクチャがあります。

例えば:

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 は varchar ではなく nvarchar である必要があります。

4

1 に答える 1

1

この anser は、(元の投稿者からの要求により) 私自身のコメントから「昇格」されています。

.NET Framework では、文字列は既に Unicode 文字列です。

(ただし、コンソールに書き込んで Unicode 文字列をテストしないでください。通常、ターミナル ウィンドウとコンソールでは正しく表示されないためです。ただし、.NET バージョン 4.5 以降では、これがある程度サポートされています。)

注意すべきことはEncoding、外部ソースからテキストを取得する場合です。この場合、 のコンストラクターは、以下BinaryReaderを受け取るオーバーロードを提供しますEncoding

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

SQL Server では、中国語の文字列を保持する必要があるすべての列が、( )だけでなくnvarchar(または) 型であることを確認してください。そうしないと、照合順序によっては、列が一般的な Unicode 文字を保持できない場合があります (8 ビットの Microsoft コード ページによって内部的に表現される場合があります)。ncharvarcharchar

ncharSQL でリテラルを指定するときは常に、形式だけでN'my text'なくを使用して、リテラルが単なる ではなく'my text'として解釈されるようにします。たとえば、多くの照合順序で while とは異なり、基になるコード ページで同じ値に (射影される) 可能性があります。ncharcharN'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コメントから)。ORDER BYあなたがそのコラム、または同様のものでない限り、それはおそらく問題ありません。この列で並べ替える場合、列 (​​またはデータベース全体) に中国語の照合順序を使用することを検討してください。

于 2013-06-04T15:49:56.747 に答える