私は最初のCOMクラスを作成しました。私の単体テストは正常に機能しますが、COMオブジェクトの最初の使用で問題が発生しました。
COMクラスは、文字列を受け取り、それを操作して文字列を返すメソッドを提供します。COMオブジェクトのコンシューマーは、dBASEPLUSプログラムです。
入力文字列に一般的なキーボード文字(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")
ここで、€は16進数の80であり、
C#メソッドはそれをUnicodeとして受け取ります:
public string MyMethod(string source)
{
// source is Unicode and now the Euro symbol is hex 20AC
...
}
文字列の元の16進コンテンツが必要なため、この再マッピングは避けたいと思います。
次の文字列を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からWindows-1252に100%変換する方法はありますか?