2012-06-04 1 views
2

C# 유니 코드 문자열을 COM 객체의 속성에 전달하려고 시도하는 Autodesk Navisworks 용 플러그인을 작성하고 있습니다. 그러나 문자열이 프로세스의 어딘가에 잘못 인코딩됩니다.C#에서 COM Interop을 통해 문자열을 마샬링 할 때 인코딩이 실패합니다 (double UTF8 인코딩?)

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

"中文"가 "??" ASCII로 제한된 문자열은 정상적으로 작동합니다 (예 : "abcd"). 또한 동일한 객체에 Value-property (VARIANT)를 설정하면 이름이 아니라 제대로 작동합니다. A (유니 코드) 문자열로이 어떻게 든

C3 A4 

와 "인코딩":

property.Name = "\u00c3\u00a4"; // shows up as "ä" 

놀랍게도이

또한 탐사는 UTF-8 문자열 "A"를 인코딩하려고 날 리드 일하는 것처럼 보였다.

다음과 같은 시도를 알려준 :

그러나
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에서 잘못 지정된 인코딩)? 또는 응용 프로그램 내부의 이상한 코드일까요? 마샬링 문제인 경우이 속성에 대해서만 수정할 수 있습니까?

+0

출력을 16 진수로 덤프 할 수 있습니까? 이게 어디로 갈지 생각 중이에요. – dda

답변

2

Name은 "내부"문자열 이었으므로 GUI에 표시된 텍스트의 경우 UserName 속성을 사용해야합니다.

e.e. 나는 변경이에

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

:

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

했다. 아마도 UserName은 내부적으로 인코딩을 무시하거나 잘못 처리하는 방식으로 내부적으로 Name에서 암시 적으로 설정됩니다.