- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为 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/
我是一名优秀的程序员,十分优秀!