gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:19 24 4
gpt4 key购买 nike

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

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

“中文”变成“??”在用户界面中,而仅限于 ASCII 的字符串工作得很好(例如“abcd”)。此外,在同一个对象上设置 Value-property(一个 VARIANT)可以正常工作,但不能设置 Name。

进一步探索让我尝试将字符串“ä”编码为 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 是一个“内部”字符串,我应该为 GUI 中显示的文本使用属性 UserName

即我改变了:

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

为此:

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

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

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

24 4 0
文章推荐: c# - 动态添加行到