2011-09-27 23 views
4

レジストリから値を取得しています。この値に2バイト文字が含まれている可能性があります。 私は後でこれをネットワーク経由でに転送する必要があります。をC#クライアントに表示してください。 C#はすべてUnicodeです。 非ユニコードと呼ぶと、この関数はMBCSを返します。をユニコードに変換するかユニコードに変換しない

どうすればよいですか?あなたの人生を容易にします、可能な限りUnicodeを使用し

string result = string(cbData); 
RegQueryValueExA(h_sub_key, "DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData) 

または

string result = string(cbData); 
RegQueryValueExW(h_sub_key, L"DisplayName", NULL, NULL, (LPBYTE) &result[0], &cbData) 
+1

私は、RegQueryValueExは文字数ではなくバイト数のカウントを取るので、あなたもそれを考慮に入れる必要があることを、以下の両方の回答に追加したいと思います。 – tinman

+0

また、コンストラクタとしての文字列(cbData)がコンパイルされないと言っています。もしあなたのcbDataが長すぎると、null文字であっても残りの部分はバッファに残ります(例:result.length() == cbData RegQueryValueExは6文字しかコピーしません)、RegQueryValueExは文字列を終わらせないので、長さもどこかで調整する必要があります。だからあなたがそれらを修正するまで、あなたが投稿したいずれの行も使用しないでください;) – tinman

答えて

4

。レジストリにはネイティブでUnicodeが含まれていて、ReqQueryValueExAを使用するとその場でMBCSに変換されます。なぜ不要な変換をしたいのですか?

UTF-16からUTF-8に変換することは、情報をネットワーク経由で転送することには意味がありますが、接続の両端を制御する必要はありません。

3

いいえ、それは動作しません。最初のスニペットから戻ってきた文字列は、の現在のシステムコードページに従ってコード化されています。ダブルバイトエンコーディングである可能性があります。何でもかまいません。大きな問題は、もちろん、そのインターネット接続の反対側のC#コードは、コードページの内容を推測する方法がありません。

最初のスニペットを使用しないでください。 2番目の文字列は、Windowsで使用されているネイティブエンコーディングutf16の文字列を取得します。結果はstd :: wstringである必要があります。また、バイナリ文字列を送ることができるので、C#で使われているエンコーディングです。これは一般的には良い考えではありませんが、XMLが一般的です。ワイヤ形式を設定するのはあなた次第です。

関連する問題