• 字符集的一些疑惑


    标准ASCII字符集#

    计算机由美国人发明,所以要存储英文字母,数字,标点符号,于是进行编号,产生ASCII字符集,0-127,使用1个字节存储

    GBK#

    但是中文有很多,于是产生了GBK(汉字编码字符集),包含2W多个汉字等字符,GBK中一个中文字符编码用两个字节存储

    注:GBK兼容了ASCII字符集

    我a你 表示为 xxxxxxxx xxxxxxxx 0xxxxxxx xxxxxxx xxxxxxxxx ,计算机如何识别

    GBK规定:汉字的第一个字节必须为1,来进行区别

    Unicode字符集#

    一个国家有一个字符集的话,传输会有问题

    国际组织制定了统一码:下面的两种方案

    UTF-32 :4个字节标识一个字符,太过浪费,且效率变低

    UTF-8:可变长编码方案,共分为四个长度区:1个字节,2个字节,3个字节,4个字节

    英文字符,数字等占一个字节(兼容ASCII编码),汉字字符占用3个字节

    a我m 0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 0xxxxxxx 如何识别

    a 97 01100001

    我 25105 110 001000 010001

    m 109 01101101

    解决方案:

    0xxxxxxx (ASCII码)
    110xxxxx 10xxxxxx
    1110xxxx 10xxxxxx 10xxxxxx
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    总结#

    字符编码时所使用的字符集,和解码时使用的字符集必须一致,否则会乱码

    英文,数字一般不会乱码,因为很多字符集都兼容ASCII编码

    使用Java程序对字符进行编码,解码#

    编码

    String提供如下方法 说明
    byte[] getBytes() 使用平台默认字符集将String编码为字节,结果存储到新的字节数组中
    byte[] getBytes(String charsetName) 使用指定的字符集将String编码为字节,结果存储到新的字节数组中
    //默认字符集
    String data = “a我m”;
    byte[] bytes2 =data.getBytes();
    System.out.println(Arrays.toString(bytes));
    
    //指定字符集
    String data = “a我m”;
    byte[] bytes2 =data.getBytes(“GBK”);
    System.out.println(Arrays.toString(bytes));
    

    解码

    String提供如下方法 说明
    string(byte[] bytes) 使用平台默认的字符集解码指定的字节数组来构造String
    string(byte[] bytes, String charsetName) 使用指定的字符集解码指定的字节数组来构造String
    //默认字符集
    string s1 = new String(bytes);
       
    //指定字符集
    string s1 = new String(bytes,"GBK");
    
  • 相关阅读:
    ES数据存储和集群路由原理
    多维时序 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络的多变量时间序列预测
    易点易动固定资产管理系统:实现全生命周期闭环式管理和快速盘点
    双指针法——移除元素
    【c语言】字符函数和字符串函数(下)
    技术分享| 融合调度系统中的电子围栏功能说明
    mybatis模糊查询
    JavaWeb在线问题.系列博文入口
    dws层商品订单主题,220623,hm,
    基于 QT 实现 Task Timer,高效利用时间
  • 原文地址:https://www.cnblogs.com/gk0d/p/16890478.html