utf-8编码的中文字符串转换成 gb2312编码的中文十六进制编码
在用js做项目时,接收方是要用GB2312的汉字编码,而发送方用的是UTF-8汉字编码。
这里就要做汉字编码转换了
Vue中使用
GB2312_TO_Unicode(gcode) {
for (var i = 0; i < 7614; i++) {
if (gcode == _GB2312_1_87[i]) {
return _UCS2_Big_1_87[i]
}
}
return -1
},
Unicode_TO_GB2312(ucode) {
for (var i = 0; i < 7614; i++) {
if (ucode == _UCS2_Big_1_87[i]) {
return _GB2312_1_87[i]
}
}
return -1
},
ConvetEndian(uincodeLE) {
//高8位和低8位互换
var tmp1 = 0,
tmp2 = 0,
tmp3 = 0
tmp1 = uincodeLE & 0x00ff
tmp2 = uincodeLE >> 8
tmp3 = tmp2 | (tmp1 << 8)
return tmp3
},
utf8ToUnicode(indata) {
var hbs = indata[0]
var dcode = 0
var dcnt = 0
if (hbs > 0xfe) {
//超标,不能转换
return -1
} else if (hbs >= 0xfc) {
// 6
dcnt = 6
dcode |= hbs & 0x01
} else if (hbs >= 0xf8) {
// 5
dcnt = 5
dcode |= hbs & 0x03
} else if (hbs >= 0xf0) {
// 4
dcnt = 4
dcode |= hbs & 0x07
} else if (hbs >= 0xe0) {
// 3
dcnt = 3
dcode |= hbs & 0x0f
} else if (hbs >= 0xc0) {
// 2
dcnt = 2
dcode |= hbs & 0x1f
} else {
dcnt = 1
}
if (dcnt == 1) {
return indata[0]
}
for (var i = 1; i < dcnt; i++) {
dcode <<= 6 //低位留出6个bit给新数据
dcode |= indata[i] & 0x3f //取得新数据的低位6个bit
}
return dcode
},
Unicode_TO_UTF8(code) {
/*UTF-8编码方式
* 0000 0000 - 0000 007F | 0XXXXXXX
* 0000 0080 - 0000 07FF | 110XXXXX 10XXXXXX
* 0000 0800 - 0000 FFFF | 1110XXXX 10XXXXXX 10XXXXXX
* 0001 0000 - 001F FFFF | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
* 0020 0000 - 03FF FFFF | 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
* 0400 0000 - 7FFF FFFF | 1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
*/
var out = [0]
var bCnt = -1
if (code > 0x7fffffff) {
//太大放不下了
bCnt = -1
return -1
} else if (code > 0x03ffffff) {
// 6个字节,0400 0000 - 7FFF FFFF
bCnt = 6
} else if (code > 0x001fffff) {
// 5个字节
bCnt = 5
} else if (code > 0x0000ffff) {
// 4个字节
bCnt = 4
} else if (code > 0x000007ff) {
// 3个字节
bCnt = 3
} else if (code > 0x0000007f) {
// 2个字节
bCnt = 2
} // 1个字节
else {
bCnt = 1
}
if (bCnt == 1) {
out[0] = code
return bCnt
}
var hbs = 0x80 //首字节高位
var utf8Code = 0
// qDebug("codeIn:%x",code);
for (var i = 0; i < bCnt - 1; i++) {
out[bCnt - i - 1] = 0x80 | (code & 0x3f) //取最后6Bits
code >>= 6 //丢掉6Bits
hbs >>= 1
hbs |= 0x80 //首字节高位多一个“1”
}
out[0] = hbs | code //首字节
for (var i = 0; i < bCnt; i++) {
utf8Code <<= 8
utf8Code |= out[i]
}
return utf8Code
},
//中文UTF-8转十六进制
TextCodec(codeType, format, inputStr) {
// console.log('inputStr===')
// console.log(inputStr)
// var InputStrCode = '';
var OutputStr = '\n'
var inputCode = 0
var targetCode = 0
var inputChar = new String()
for (var i = 0; i < inputStr.length; i++) {
inputCode = inputStr.charCodeAt(i)
inputChar = inputStr.charAt(i)
targetCode = inputCode
// OutputStr += "//targetCode:" + targetCode.toString(16).toUpperCase() + "\n";
if (inputCode > 0x80) {
//acscii 0~127
var unicode = inputCode //Mixly 默认编码 UCS-2 Big Endian
// OutputStr += "//unicode:" + unicode.toString(16).toUpperCase() + "\n";
switch (codeType) {
case 'GB2312':
targetCode = this.Unicode_TO_GB2312(unicode)
break
case 'UTF-8':
targetCode = this.Unicode_TO_UTF8(unicode)
break
case 'UCS-2 Big Endian':
targetCode = unicode
break
case 'UCS-2 Little Endian':
targetCode = this.ConvetEndian(unicode)
break
default:
break
}
}
switch (format) {
case 'short':
if (targetCode & 0xff0000) {
//3bytes
for (var k = 2; k >= 0; k--) {
var _byte = (targetCode >> (8 * k)) & 0xff
OutputStr += '0x' + _byte.toString(16).toUpperCase() + ','
}
} else if (targetCode & 0xff00) {
//2bytes
for (var k = 1; k >= 0; k--) {
var _byte = (targetCode >> (8 * k)) & 0xff
OutputStr += '0x' + _byte.toString(16).toUpperCase() + ','
}
} //1byte
else {
var _byte = targetCode
OutputStr += '0x' + _byte.toString(16).toUpperCase() + ','
}
OutputStr += '//' + inputChar + ' ' + codeType + '\n'
break
case 'long':
// OutputStr += '0x' + targetCode.toString(16).toUpperCase() + ',' + '//' + inputChar + ' ' + codeType + '\n'
OutputStr += targetCode.toString(16).toUpperCase()
// OutputStr += targetCode
break
default:
OutputStr += '0x' + targetCode.toString(16).toUpperCase() + ',' + '//' + inputChar + ' ' + codeType + '\n'
break
}
}
return OutputStr
},
import { _GB2312_1_87, _UCS2_Big_1_87 } from '@/utils/_GB2312_1_87.js'
_GB2312_1_87.js文件:文件太长无法上传,可参考:blog.csdn.net/u013866683/…