xuqinggang/blog

字符字节以及编解码之间的关系

xuqinggang opened this issue · 0 comments

字符串编解码

  1. 字符串,有多种编码方式(常见的utf8、base64、hex等等)

  2. 字符串编解码转换:

  • 编码: 一般是指以utf8编码的字符串,以指定编码方式编码为指定编码字符串

  • 解码: 将编码后的字符串,以指定的编码方式解码为utf8字符串

    举例:

      // 字符串base64编解码
      module.exports = {
        encode: function(str) {
          // Buffer.from 默认的encoding为utf8 将utf8编码的字符串转换为base64编码的字符串
          return Buffer.from(str).toString('base64');
        },
        decode: function(str) {
          // 将base64编码的字符串,转换为utf8编码字符串 toString默认参数为utf8(toString('utf8'))
          return Buffer.from(str, 'base64').toString();
        }
      };
  1. 统计不同编码方式字符串的字节
  • utf8:
    • 占2个字节的:带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码;
    • 占3个字节的:基本等同于GBK,含21000多个汉字;
    • 占4个字节的:中日韩超大字符集里面的汉字,有5万多个;
    • 一个utf8数字占1个字节;一个utf8英文字母占1个字节;少数是汉字每个占3个字节,多数占用4个字节
  • base64: 见参考文献Base64笔记
  • 举例:
    const dong = '您好,世界!';
    > dong.length; // 6(utf8字符数)
    > Buffer.byteLength(dong,'utf8'); // 18 (一个utf8中文字符=三个字节)(里面的标点符号为中文下的)
    > Buffer.byteLength(Buffer.from(dong).toString('utf16le'),'utf16le'); // 18
    > Buffer.byteLength(Buffer.from(dong).toString('base64'),'base64'); // 18
    > Buffer.byteLength(Buffer.from(dong).toString('hex'),'hex'); // 18

参考文献:

UTF-8编码占几个字节
Base64笔记
hex