我正在为 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/