C# C++DLL 호출, 중국어 문자를 올바르게 수신 및 전달하는 방법

2251 단어
일반적으로 c++ dll 라이브러리 문자 인코딩 방식은utf-8이고 c#가 dll을 호출할 때 중국어 문자의 수신과 전달을 만나면 중국어 문자가 혼란스러워지고 전달할 수 없습니다.대응 관계에 따라 dll의 매개 변수가char[]이면 예를 들어char[64]name;의 c# 문자는 [marshalAs(UnmanagedType.ByValTstr, SizeConstr = 64)] public string name으로 정의됩니다.name이 중국어인 경우NET 플랫폼은 주로 유니코드 문자 집합을 사용하는데 gb2312,utf-16 등이 될 수 있다.수신된Name에 대해utf-8에서 유니코드로 변환하면 정확한 결과를 얻을 수 없습니다.마찬가지로name에 대한 유니코드에서utf-8로의 변환도 데이터를 정확하게 전달할 수 없습니다.dll에서 얻은char가 스텔스 변환이string이 되었기 때문에utf-8과 유니코드 한자 인코딩 바이트의 수가 일치하지 않아 스텔스 변환 오류가 발생했고 그 다음에 변환을 하면 정확한 결과를 얻을 수 없습니다.해결 방법: [marshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] name;byte[]로 수신/전달된 문자를 수신하거나 봉인하여 인코딩하여 변환합니다.다음은 인코딩 변환의 예입니다.
public static string GetDefaultString(byte[] utf8String)
        {
            utf8String = Encoding.Convert(Encoding.GetEncoding("UTF-8"), Encoding.Unicode, utf8String);
            string strUnicode = Encoding.Unicode.GetString(utf8String);
            strUnicode = strUnicode.Substring(0, strUnicode.IndexOf('\0'));
            return strUnicode; 
        }
        public static void GetUTF8Buffer(string inputString, int bufferLen, out byte[] utf8Buffer)
        {
            utf8Buffer = new byte[bufferLen];
            byte[] tempBuffer = System.Text.Encoding.UTF8.GetBytes(inputString);
            for (int i = 0; i < tempBuffer.Length; ++i)
            {
                utf8Buffer[i] = tempBuffer[i];
            }
        }

좋은 웹페이지 즐겨찾기