153 lines
4.3 KiB
TypeScript
153 lines
4.3 KiB
TypeScript
|
import gb2312 from './gb2312.json'
|
||
|
|
||
|
export class StringBase64 {
|
||
|
static ToBase64_gb2312(str: string): string {
|
||
|
let bin = this.toGB2312Bytes(str || '')
|
||
|
let str64 = this.encode(bin)
|
||
|
return str64
|
||
|
}
|
||
|
|
||
|
static _table = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||
|
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/']
|
||
|
|
||
|
/** 将二进制转换成base64 */
|
||
|
static encode(bin: number[]): string {
|
||
|
let codes = []
|
||
|
let un = 0
|
||
|
un = bin.length % 3
|
||
|
if (un == 1)
|
||
|
bin.push(0, 0)
|
||
|
else if (un == 2)
|
||
|
bin.push(0)
|
||
|
for (let i = 2; i < bin.length; i += 3) {
|
||
|
let c = bin[i - 2] << 16
|
||
|
c |= bin[i - 1] << 8
|
||
|
c |= bin[i]
|
||
|
codes.push(this._table[c >> 18 & 0x3F])
|
||
|
codes.push(this._table[c >> 12 & 0x3F])
|
||
|
codes.push(this._table[c >> 6 & 0x3F])
|
||
|
codes.push(this._table[c & 0x3F])
|
||
|
}
|
||
|
if (un >= 1) {
|
||
|
codes[codes.length - 1] = '='
|
||
|
bin.pop()
|
||
|
}
|
||
|
if (un == 1) {
|
||
|
codes[codes.length - 2] = '='
|
||
|
bin.pop()
|
||
|
}
|
||
|
return codes.join('')
|
||
|
}
|
||
|
|
||
|
/** 将utf8 转成gb2312字符串 */
|
||
|
static toGb2312String(str1: string): string {
|
||
|
let substr = ''
|
||
|
let a = ''
|
||
|
let b = ''
|
||
|
let c = ''
|
||
|
let i = -1
|
||
|
i = str1.indexOf('%')
|
||
|
if (i == -1) {
|
||
|
return str1
|
||
|
}
|
||
|
while (i != -1) {
|
||
|
if (i < 3) {
|
||
|
substr = substr + str1.substr(0, i - 1)
|
||
|
str1 = str1.substr(i + 1, str1.length - i)
|
||
|
a = str1.substr(0, 2)
|
||
|
str1 = str1.substr(2, str1.length - 2)
|
||
|
if ((Number.parseInt(`0x${a}`) & 0x80) == 0) {
|
||
|
substr = substr + String.fromCharCode(Number.parseInt(`0x${a}`))
|
||
|
}
|
||
|
else if ((Number.parseInt(`0x${a}`) & 0xE0) == 0xC0) { // two byte
|
||
|
b = str1.substr(1, 2)
|
||
|
str1 = str1.substr(3, str1.length - 3)
|
||
|
let widechar = (Number.parseInt(`0x${a}`) & 0x1F) << 6
|
||
|
widechar = widechar | (Number.parseInt(`0x${b}`) & 0x3F)
|
||
|
substr = substr + String.fromCharCode(widechar)
|
||
|
}
|
||
|
else {
|
||
|
b = str1.substr(1, 2)
|
||
|
str1 = str1.substr(3, str1.length - 3)
|
||
|
c = str1.substr(1, 2)
|
||
|
str1 = str1.substr(3, str1.length - 3)
|
||
|
let widechar = (Number.parseInt(`0x${a}`) & 0x0F) << 12
|
||
|
widechar = widechar | ((Number.parseInt(`0x${b}`) & 0x3F) << 6)
|
||
|
widechar = widechar | (Number.parseInt(`0x${c}`) & 0x3F)
|
||
|
substr = substr + String.fromCharCode(widechar)
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
substr = substr + str1.substring(0, i)
|
||
|
str1 = str1.substring(i)
|
||
|
}
|
||
|
i = str1.indexOf('%')
|
||
|
}
|
||
|
|
||
|
return substr + str1
|
||
|
}
|
||
|
|
||
|
private static _unicode2gb
|
||
|
static getUnicode2gb() {
|
||
|
if (this._unicode2gb == null) {
|
||
|
this._unicode2gb = gb2312
|
||
|
}
|
||
|
return this._unicode2gb
|
||
|
}
|
||
|
|
||
|
static toGB2312Bytes(str: string): number[] {
|
||
|
let unicode2gb = this.getUnicode2gb()
|
||
|
let res = []; let len = str.length
|
||
|
for (let i = 0; i < len; i++) {
|
||
|
let code = str.charCodeAt(i)
|
||
|
if (code <= 0x007F) {
|
||
|
res.push(code)
|
||
|
}
|
||
|
else {
|
||
|
let hex = unicode2gb[`0x${code.toString(16).toUpperCase()}`]
|
||
|
let gb = Number(hex)
|
||
|
if (Number.isNaN(gb))
|
||
|
gb = Number('0xA1F5')
|
||
|
|
||
|
let arr = []
|
||
|
while (gb > 0) {
|
||
|
arr.push(gb & 0xFF)
|
||
|
gb >>= 8
|
||
|
}
|
||
|
while (arr.length > 0) res.push(arr.pop())
|
||
|
}
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
static fromGB2312Bytes(gb2312Bytes: number[]): string {
|
||
|
let unicode2gb = this.getUnicode2gb()
|
||
|
let res = []
|
||
|
// var i = 0
|
||
|
for (let i = 0; i < gb2312Bytes.length; i++) {
|
||
|
let code = gb2312Bytes[i]
|
||
|
if (code < 0xA1 || code > 0xFE || i + 1 == gb2312Bytes.length) {
|
||
|
res.push(String.fromCharCode(code))
|
||
|
continue
|
||
|
}
|
||
|
let c2 = gb2312Bytes[i + 1]
|
||
|
if (code < 0xA1 || code > 0xFE) {
|
||
|
res.push(String.fromCharCode(code))
|
||
|
continue
|
||
|
}
|
||
|
let g = c2 | code << 8
|
||
|
|
||
|
c2 = Number(unicode2gb[`0x${g.toString(16).toUpperCase()}`])
|
||
|
if (typeof c2 == 'undefined') {
|
||
|
res.push(String.fromCharCode(code))
|
||
|
continue
|
||
|
}
|
||
|
res.push(String.fromCharCode(c2))
|
||
|
i++
|
||
|
}
|
||
|
return res.join('')
|
||
|
}
|
||
|
}
|