2017-02-28 5 views
0

a.C/C# Marshal.PtrToStringAnsi Chinesisch verstümmelt

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

, verstümmelt seine Rückkehr Chinesisch.

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); 
} 

, Chinesisch-Display, aber die Länge der Zeichenfolge zurückgegeben.

Ich brauche Hilfe!

+0

Wer sendet Ihnen die Zeichenfolge? Eine C-Funktion? Was ist der Inhalt von 'strbuf'? Und die erwartete Zeichenfolge? – xanatos

+0

[UnmanagedFunctionPointer (CallingConvention.StdCall)] public delegate void WriteToConsoleCallback (IntPtr str) ‚‘ SetRecvDataCallback setRecvDataCallback = (SetRecvDataCallback) Marshal.GetDelegateForFunctionPointer (hapi2, typeof (SetRecvDataCallback)); Callback = neu WriteToConsoleCallback (onMessage); setRecvDataCallback (Rückruf); – aiwll

+0

Sie sind Funktionen von nicht-öffentlichen Bibliotheken ... Versuchen Sie, uns den Inhalt von 'strbuf' (in hex) und den gewünschten Text (wenn Sie es wissen) – xanatos

Antwort

0

Hier gibt es verschiedene Codepages, die chinesisch sind ... die man versuchen, das, was zu passen scheint, du erwartest. Ich habe sogar den Code vereinfacht, um den IntPtr Puffer zu einem byte[] Puffer zu kopieren.

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); 
} 
Verwandte Themen