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 でエンコーディングが正しく指定されていないなど)? それとも、アプリケーション内の奇妙なコードでしょうか? マーシャリングの問題である場合、このプロパティのみを変更できますか?