js虽然有第三方支持的GBK工具,但是小程序没有;而我开发中又需要进行格式的转化,就依据前人的经验做了一份出来。
分为两部分:Decode.js和Encode.js。分别是GBK格式的二进制文件转化为UTF-8的String和反转。
import Encoder from "./encode/Encoder";
import Decoder from "./encode/Decoder";
//实现参考例子
var message = "减肥是一件困难的事情";
//UTF-8转GBK
var gbkArray = Encoder.hexstrToArray(Encoder.stringToGbkHexstr(message));
console.log("gbkArray>>" + gbkArray);
//GBK转UTF-8
var utfStr = Decoder.GBKHexstrToString(Decoder.binaryarrayToHexstr(gbkArray));
console.log("utfStr>>" + utfStr);
文件下载地址:GITHUB
Decoder.js 因为太长,所以只贴出关键代码
/**
* GBK二进制编码集合,转换成标准的javascript String输出
*/
function GBKHexstrToString(input){
if (input.length % 2 !== 0) {
throw new Error('错误的输入:' + input);
}
var output = '';
for (var offset = 0; offset < input.length;) {
var value = input.substring(offset, offset + 2);
offset += 2;
if (value.charAt(0) < '8') {
output += String.fromCharCode(parseInt(value, 16));
continue;
} else {
var low = input.substring(offset, offset + 2);
offset += 2;
value = value + low;
output += String.fromCharCode(GBKTable[parseInt(value, 16)]);
}
}
return output;
}
/**
* 将binaryArray转化成hexString
*
* @param array 输入的binaryArray
* @returns {string} 输出的hexString
*/
function binaryarrayToHexstr (array) {
var output = '';
array.forEach(function (i) {
output += oneByteIntToHex(i);
});
return output.toUpperCase();
};
/***
* 将一个字节的整型转换成16进制
*
* @private
* @param i
* @returns {string}
*/
function oneByteIntToHex (i) {
var output = '';
i = parseInt(i);
output += (i >> 4 & 0x0f).toString(16);
output += (i & 0x0f).toString(16);
return output.toUpperCase();
};
module.exports = {
GBKHexstrToString: GBKHexstrToString,
oneByteIntToHex: oneByteIntToHex,
binaryarrayToHexstr: binaryarrayToHexstr
}
Encode.js
/**
* 标准的Javascript String转换成GBK二进制编码集合输出
* 支持Array/String输入,异步
*/
function stringToGbkHexstr (input) {
var output = '';
for (var offset = 0; offset < input.length; offset++) {
var code = input.charCodeAt(offset) & 0xffff;
if (code <= 0xFF) {
output += intToHex(code);
} else {
output += GBKTable[code];
}
}
return output;
}
/***
* 将一个字节的整型转换成16进制
*
* @private
* @param i
* @returns {string}
*/
function intToHex (i) {
var output = '';
for (; i != 0; i = i >> 8) {
output = oneByteIntToHex(i & 0xff) + output;
}
return output.toUpperCase();
}
/***
* 将一个字节的整型转换成16进制
*
* @private
* @param i
* @returns {string}
*/
function oneByteIntToHex (i) {
var output = '';
i = parseInt(i);
output += (i >> 4 & 0x0f).toString(16);
output += (i & 0x0f).toString(16);
return output.toUpperCase();
};
/**
* HexStr 转 ArrayBuffer
*/
function hexstrToArray (input) {
if (input.length % 2 != 0) {
throw new Error("not support length:" + input.length);
}
var output = new Array();
var index = 0, offset = 0;
for (; offset < input.length;) {
var expected = input.substring(offset, offset + 1);
var hi = (parseInt(expected, 16) & 0xff) << 4;
offset++;
expected = input.substring(offset, offset + 1);
var lo = parseInt(expected, 16) & 0xff;
output[index] = hi + lo;
index++;
offset++;
}
return output;
}
module.exports = {
stringToGbkHexstr: stringToGbkHexstr,
intToHex: intToHex,
hexstrToArray: hexstrToArray
}