问题描述:项目中服务端使用的GBK编码,中文字符串传输到客户端后,需要转换成UTF-8编码才能正常显示。
方法一:使用TextDecoder方法
// 先在buffer中取strlen长度的数据,是GBK编码的字符串,buffer是服务器传过来的
var bytes = new Uint8Array(view.buffer, offset, strlen);
// 调用下面的方法直接转换
var str = new TextDecoder('gbk').decode(bytes);
此方法在web环境和微信开发工具上都是没问题的,但是在真机上回报没有TextDecoder方法的错误。
并且这个方法并没有对应的TexEncoder方法,我们还有上传字符串的需求,因此只能考虑别的方法。
方法二:使用iconv-lite库
微信小游戏支持添加npm库,先添加iconv-lite库
// 在控制台进入wechatgame项目根目录,执行以下代码,可以使用默认配置,最后输入"yes"
npm init
// 初始化完成后,安装库
mpm i iconv-lite
// 由于iconv库是基于nodejs写的,而微信缺少相关库,所以这里要再加两个库,不然会报错
mpm i buffer
mpm i string_decoder
装好后有一下内容:
然后打开微信开发工具,打开“详情->本地设置“,勾选“使用npm模块”
打开菜单里面的“工具”,选择“构建npm”,构建完成就可以使用了。
const { Buffer } = require("buffer");
var iconv = require("iconv-lite");
let str2gbk = function (str) {
if (str.length <= 0) return [];
return iconv.encode(str, 'GBK');
};
let gbk2str = function (bytes) {
if (bytes.length <= 0) return "";
return iconv.decode(Buffer.from(bytes), 'GBK');
};
解消息和发消息时:
// 发送消息时,将str字符串写入buffer
var bytes = str2gbk(str);
for (var j = 0; j < bytes.length; j++) {
view.setInt8(offset++, bytes[j]);
}
// 接收消息时,在buffer中读取字符串
var bytes = new Uint8Array(view.buffer, offset, strlen);
offset += strlen;
let str = gbk2str(bytes);
版权声明:本文为ldpjay原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。