【微信小游戏】CocosCreator做小游戏 — 字符串编码转换(UTF-8和GBK互转)

问题描述:项目中服务端使用的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版权协议,转载请附上原文出处链接和本声明。