2017-02-28 20 views
0

a。C/C#Marshal.PtrToStringAnsi中国語文字化け:

static void onMessage(IntPtr str) 
{ 
    string message = Marshal.PtrToStringAnsi(str); 
    Console.Write(message); 
} 

、その戻り中国人が文字化け。

Bを。

public static void onMessage(IntPtr str) 

    { 
     int nAnsiLength = Marshal.PtrToStringAnsi(str).Length; 
     int nUniLength = Marshal.PtrToStringUni(str).Length; 
     int nMaxLength = (nAnsiLength > nUniLength) ? nAnsiLength : nUniLength; 
     int length = 0;//循环查找字符串的长度 
     for (int i = 0; i < nAnsiLength; i++) 
     { 
      byte[] strbuf1 = new byte[1]; 
      Marshal.Copy(str + i, strbuf1, 0, 1); 
      if (strbuf1[0] == 0) 
      { 
       break; 
      } 
      length++; 
     } 

     byte[] strbuf = new byte[length]; 
     Marshal.Copy(str, strbuf, 0, length); 

     string message = System.Text.UTF8Encoding.UTF8.GetString(strbuf); 
} 

、中国の表示が、文字列の長さが返される。

私は助けが必要!

+0

誰があなたに文字列を送信しますか? C関数? 'strbuf'の内容は何ですか?そして予想される文字列? – xanatos

+0

[UnmanagedFunctionPointer(CallingConvention.StdCall)] パブリックデリゲートボイドWriteToConsoleCallback(のIntPtr STR)「」SetRecvDataCallback setRecvDataCallback = (SetRecvDataCallback)Marshal.GetDelegateForFunctionPointer(hapi2、typeof演算(SetRecvDataCallback))。 コールバック=新しいWriteToConsoleCallback(onMessage); setRecvDataCallback(コールバック); – aiwll

+0

これらは非公開のライブラリの機能です... 'strbuf'(16進数)と欲しいテキストの内容を教えてください(あなたが知っていれば) – xanatos

答えて

0

ここで中国のあるさまざまなコードページがあります...何に合うように思われるものを試してみてくださいあなたは期待しています。私はIntPtrバッファをbyte[]バッファにコピーするコードを単純化しました。

public static void onMessage(IntPtr str) { 
    int length = 0;//循环查找字符串的长度 

    while (Marshal.ReadByte(str + length) != 0) { 
     length++; 
    } 

    byte[] strbuf = new byte[length]; 
    Marshal.Copy(str, strbuf, 0, length); 

    // Taken from https://msdn.microsoft.com/it-it/library/system.text.encodinginfo.getencoding(v=vs.110).aspx 
    string message1 = Encoding.UTF8.GetString(strbuf); 
    string message2 = Encoding.GetEncoding(54936).GetString(strbuf); 
    string message3 = Encoding.GetEncoding(936).GetString(strbuf); 
    string message4 = Encoding.GetEncoding(950).GetString(strbuf); 
    string message5 = Encoding.GetEncoding(10002).GetString(strbuf); 
    string message6 = Encoding.GetEncoding(10008).GetString(strbuf); 
    string message7 = Encoding.GetEncoding(20000).GetString(strbuf); 
    string message8 = Encoding.GetEncoding(20002).GetString(strbuf); 
    string message9 = Encoding.GetEncoding(20936).GetString(strbuf); 
    string message10 = Encoding.GetEncoding(50227).GetString(strbuf); 
    string message11 = Encoding.GetEncoding(51936).GetString(strbuf); 
    string message12 = Encoding.GetEncoding(52936).GetString(strbuf); 
} 
関連する問題