我已经编写了我的第一个 COM 类。我的单元测试工作正常,但我第一次使用 COM 对象遇到了障碍。
COM 类提供接受字符串、操作字符串并返回字符串的方法。COM 对象的使用者是一个 dBASE PLUS 程序。
当输入字符串包含常用键盘字符(ASCII 127 或更低)时,COM 方法可以正常工作。但是,如果字符串包含超出 ASCII 范围的字符,其中一些会从 Windows-1252 重新映射到 C# 的 Unicode。此表显示发生的映射:http ://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
例如,如果 dBASE 程序使用以下命令调用 COM 对象:
oMyComObject.MyMethod("It will cost
€123")
其中 € 是十六进制 80,
C# 方法将其作为 Unicode 接收:
public string MyMethod(string source)
{
// source is Unicode and now the Euro symbol is hex 20AC
...
}
我想避免这种重新映射,因为我想要字符串的原始十六进制内容。
我尝试将以下内容添加到 MyMethod 以将字符串转换回 Windows-1252,但欧元符号会丢失,因为它变成了一个问号:
byte[] UnicodeBytes = Encoding.Unicode.GetBytes(source.ToString());
byte[] Win1252Bytes = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(1252), UnicodeBytes);
string Win1252 = Encoding.GetEncoding(1252).GetString(Win1252Bytes);
有没有办法防止将“源”参数转换为 Unicode?或者,有没有办法将它从 Unicode 100% 转换回 Windows-1252?