UNICODE 文字列 (中国語) を MBCS に変換して、SQL クエリにパラメーターとして追加したいと考えています。(varcharのSQL Serverの列なので、この変換は私にとって必要です)。
c# で MBCS に変換するにはどうすればよいですか? 助けてください。
ありがとう、プラセオ
「MBCS」は、いくつかのエンコーディングである可能性があります。中国ロケールの場合、GB バリアントのコード ページ 936になり、次を使用してそのバイトにエンコードできます。
byte[] bytes= Encoding.GetEncoding(936).GetBytes("你好")
=>
{196, 227, 186, 195}
特に GB エンコーディングについて話しているのではなく、現在のシステムのデフォルトのマルチバイト エンコーディングが必要な場合は、その MBCS エンコーディングとなるデフォルト (「ANSI」) エンコーディングを使用できます。
byte[] bytes= Encoding.Default.GetBytes("你好")
=>
{196, 227, 186, 195} // on a system in the China locale (cp936)
{167, 65, 166, 110} // on a system in the HK locale (cp950)
バイト配列をクエリに入れるには、次のいずれかを行う必要があります。
1) バイトベースの SqlDbType でパラメーターを使用するのが最適です。例:
command.Parameters.AddWithValue("@greeting", bytes);
2) または、クエリ文字列に直接挿入する必要がある場合は、バイトを 16 進リテラルとしてエンコードします。例:
"0x"+BitConverter.ToString(bytes).Replace("-", "")
=>
... WHERE greeting=0xC4E3BAC3 ...
(これは非 ANSI 標準の SQL Server 構文です)
ヒントをくれてありがとうボビンス。ただし、クエリの実行をパラメーター化できませんでした。
最後に、私の先輩の同僚の 1 人が助けてくれました。:) T-SQL で従来のデータベースの varchar 列と比較するために、Unicode でエンコードされた文字列をマルチバイト文字 (MBCS) で構成される文字列に変換する別のソリューションを次に示します。
クラス SqlString のメソッド GetNonUnicodeBytes() を利用できます。
以下にコード スニペットを示します。
string inputUnicodeString = "你好";
SqlString mySqlString = new SqlString(inputUnicodeString);
byte[] mbcsBytes = mySqlString.GetNonUnicodeBytes();
string outputMbcsString = string.Empty;
for (int index = 0; index < mbcsBytes.Length; index++)
{
outputMbcsString += Convert.ToChar(mbcsBytes[index]);
}
これは、必要な varchar データベース列とユーザーが要求した UNICODE の文字列を比較するのに役立ちました。この返信が他の人に役立つことを願っています。
よろしく、
プラセオ