中文字符转十六进制编码

319 阅读2分钟

转自:blog.csdn.net/u013866683/…

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/…