c# - 在 C# 中通过 COM Interop 编码字符串时编码失败(双 UTF8 编码?)

标签 c# unicode marshalling com-interop autodesk-navisworks

我正在为 Autodesk Navisworks 编写一个插件,尝试将 C# unicode 字符串传递给 COM 对象上的属性。但是,该字符串在该过程中的某处编码不正确。

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

“中文”显示为“??”在用户界面中,而仅限于 ASCII 的字符串可以正常工作(例如“abcd”)。此外,在同一对象上设置值属性(VARIANT)效果很好,但不能设置名称。

进一步的探索让我尝试将字符串“ä”编码为 utf-8:

C3 A4

并以某种方式将其“编码”为(unicode)字符串:

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 中指定的编码不正确)?或者应用程序内可能有一些奇怪的代码?如果是编码问题,我可以只针对此属性进行修改吗?

最佳答案

原来 Name 是一个“内部”字符串,我应该使用属性 UserName 来显示 GUI 中的文本。

即我改变了:

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

对此:

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

这有效。据推测,UserName 是在内部以某种方式隐式设置的,忽略或错误处理编码。

关于c# - 在 C# 中通过 COM Interop 编码字符串时编码失败(双 UTF8 编码?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10887352/

相关文章:

c# - 防止按钮点击事件,根据条件向Listview添加行

string - 如何在现代 Delphi 中将 AnsiString 转换为整数?

android - 可序列化对象在放入包中时是否总是被序列化?

c# - 在 C# 中使用后期绑定(bind)获取特定的 Excel 实例

c# - 如何将简单的 .cs 文件组合成一个 .cs 文件,所有用途都在顶部以便编译

c# - 如果一个操作数是可空类型,则 Expression.GreaterThan 失败,另一个是不可空类型

javascript - 为什么 twemoji 对大多数表情符号 unicode 都失败?

python-2.7 - 如何处理 cx_Oracle 和 python 2.7 中的 unicode 数据?

c# - 如何编码包含 char 矩阵的数组结构

java - 使用 jaxb 将 java 对象转换为 xml,反之亦然(marshal 和 unmarshal)