解决在Unity3D中通过Post向服务器提交请求,表单中带有中文导致的乱码问题!

此方法只能在PC端使用,在移动端无效,若想要解决中文乱码问题,可以把项目升级到5.3以后,并使用Unity自带的UnityWebRequest的Get方法,大致框架如下:

UnityWebRequest webRequest = UnityWebRequest.Get(data);
yield return webRequest.Send();
if (webRequest.error != null)
{
}
else
{
    string returnMessage = webRequest.downloadHandler.text;
}
webRequest.Abort();


好久没写博客了,最近公司比较忙,今天熬夜解决了一个问题,很有成就感,网上相关资料比较少,所以我打算写下来分享出来。

这个功能是公司的需求,就是要实现中文账号登录的功能,最初的写法就是用的unity自带的www功能,简单几行就可以实现post请求,缺点就是unity自带的www无法实现编码转换。所以是不支持中文账号提交的。实现代码如下:

void Start()
    {
        StartCoroutine(DoPost());
    }

    IEnumerator DoPost()
    {
        WWWForm form = new WWWForm();
        form.AddField("weixinid","admin");
        form.AddField("pwd","1234567");
        WWW www = new WWW("http://192.168.1.1/EntryformServlet", form);
        yield return www;
        if (www.error == null)
        {
            Debug.Log(www.text);
        }
        else
        {
            Debug.Log(www.error.ToString());
        }
    }
刚刚已经说了如果使用上面的方法,如果表单中传入的是中文,那么服务器接收到的是乱码,这个肯定是不行的。那怎么做呢,就是使用C#自带的HttpWebRequest函数。

废话少数,代码送上。

    void Start()
    {
        Debug.Log(PostWebRequest("http://192.168.1.1/EntryformServlet", "weixinid=测试&pwd=1234567" ));
    }
   
    private string PostWebRequest(string postUrl, string paramData)
    {
        // 把字符串转换为bype数组
        byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(paramData);
       
        HttpWebRequest webReq = (HttpWebRequest) WebRequest.Create(new Uri(postUrl));
        webReq.Method = "POST";
        webReq.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
        webReq.ContentLength = bytes.Length;
        using (Stream newStream = webReq.GetRequestStream())
        {
            newStream.Write(bytes, 0, bytes.Length);
        }
        using (WebResponse res = webReq.GetResponse())
        {
            //在这里对接收到的页面内容进行处理
            Stream responseStream = res.GetResponseStream();
            StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8"));
            string str = streamReader.ReadToEnd();
            streamReader.Close();
            responseStream.Close();
            //返回:服务器响应流 
            return str;
        }
    }
}

从上面的代码可以看出, POST 中文数据的时候,先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值