项目需要,JS 中调用REST接口 返回的是 GBK 字符串。这可以说是每一个新手程序员都深恶痛绝的问题了
要搞清楚编码间的关系,以及字符串底层的处理方式,不是一件容易的事,
折腾了好几天,才终于找到解决方法,也算是 精诚所至,金石为开吧
在JS 中都是使用的UTF-8,.页面上显示GBK 就是乱码。
1、对传入的GBK字符串,要用数据流接收,具体到angularjs中,$http 请求中需要覆盖参数responseType , responseType: "arraybuffer",
$http({ method: "POST", responseType: "arraybuffer", url: "restcater/cenchain/findCenChain", data: branchlist })2、解析
var x = new Uint8Array(resp.data);
var str =new TextDecoder('gbk').decode(x); 已经正常识别了。/
3、UTF-8提交的数据转为GBK,要引用第三方JS库
https://github.com/inexorabletash/text-encoding
<script> // var TextEncoderOrg = window.TextEncoder; // ... and deactivate it, to make sure only the polyfill encoder script that follows will be used window.TextEncoder = null; </script> <script src="lib/text-encoding/encoding-indexes.js"></script> <script src="lib/text-encoding/encoding.js"></script> //获取GBk编码的int8数组
var uint8array = new TextEncoder("gbk",{ NONSTANDARD_allowLegacyEncoding: true }).encode(string); // 放入blob中准备上传 var blob=new Blob([uint8array],{type:"text/plain"});