2

COM オブジェクトのプロパティに C# Unicode 文字列を渡そうとして、Autodesk Navisworks 用のプラグインを作成しています。ただし、文字列はプロセスのどこかで正しくエンコードされていません。

var property = ...;
property.Name = "中文";   // becomes "??"
property.Value = "中文"; // OK

「中文」は「??」と出てきます。一方、ASCII に限定された文字列 (例: "abcd") は正常に機能します。さらに、同じオブジェクトに Value プロパティ (VARIANT) を設定すると問題なく動作しますが、Name では動作しません。

さらに調べてみると、文字列 "ä" を utf-8 としてエンコードしてみることになりました。

C3 A4

そしてどういうわけかこれを(ユニコード)文字列に「エンコード」します:

property.Name = "\u00c3\u00a4"; // shows up as "ä"

驚いたことに、これは機能しているように見えました。

これにより、次のことを試すようになりました。

var bytes = Encoding.UTF8.GetBytes("中文abcd");
char[] chars = new char[bytes.Length];
for(int i = 0; i < chars.Length; i++)
    chars[i] = (char)bytes[i];
string s = new string(chars);

ただし、これを使用して「中文abcd」をエンコードしようとすると、GUIで最初の文字「中」しか取得できません。しかし、「äabcd」を使用すると、また複数の文字が表示されます...

ここで何が起きてるの?どうすれば問題を回避できますか? マーシャリングの問題ですか (COM Interop でエンコーディングが正しく指定されていないなど)? それとも、アプリケーション内の奇妙なコードでしょうか? マーシャリングの問題である場合、このプロパティのみを変更できますか?

4

1 に答える 1

2

Nameこれは「内部」文字列であることがわかりました。このプロパティUserNameを GUI に表示されるテキストに使用する必要がありました。

つまり、私は変更しました:

var property = ...;
property.Name = "中文";   // becomes "??"
property.Value = "中文"; // OK

これに:

var property = ...;
property.UserName = "中文";   // OK!
property.Value = "中文"; // OK

働いた。おそらく UserName は、エンコーディングを無視または誤って何らかの方法で内部的に Name から暗黙的に設定されます。

于 2012-06-12T15:32:26.617 に答える