首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/C# Marshal.PtrToStringAnsi中文乱码

C/C# Marshal.PtrToStringAnsi中文乱码
EN

Stack Overflow用户
提问于 2017-02-28 16:07:39
回答 1查看 265关注 0票数 0

一个。

代码语言:javascript
复制
static void onMessage(IntPtr str)
{
   string message = Marshal.PtrToStringAnsi(str);
    Console.Write(message);
} 

,它的归来中文乱码。

b.

代码语言:javascript
复制
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);
} 

,中文显示,但返回字符串的长度。

我需要帮助!

EN

回答 1

Stack Overflow用户

发布于 2017-02-28 16:38:43

这里有各种中文代码页……试一试看起来符合你期望的那个。我甚至简化了将IntPtr缓冲区复制到byte[]缓冲区的代码。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42503295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档