zoukankan      html  css  js  c++  java
  • Java中Unicode字符集和UTF8,UTF16编码

    Unicode和UTF16

    Unicode是字符集,但是Unicode不规定如何存储,即到底几个字节为一组对应一个字符;
    UTF16是Unicode字符集的一种编码方式,通过”提示位“标识几个字节编为一组,这样就可以实现字符的存储和读取了;
    位于 D800~0xDFFF 之间的 Unicode 编码是特别为四字节的 UTF-16 编码预留的,所以不应该在这个范围内指定任何字符。如果你真的去查看 Unicode 字符集,会发现这个区间内确实没有收录任何字符。
    基本转换步骤如下:
    将代码点减去 0x10000,仅保留低 20 位;
    将高 10 位加上 0xD800,得到高代理;
    将低 10 位加上 0xDC00,得到低代理;

    Java程序内部使用UTF16编码

    Java程序在内存中使用UTF16编码转换字符为数字进行存储,所以char类型可以隐式转换为int;

    int n = '你';
    System.out.println(n);
    // 20320
    System.out.println(Integer.toHexString(n));
    // 4f60
    System.out.println("u4f60");
    // 你
    

    但随着unicode字符数量增加,2字节已经不够了,所以char类型16位长度无法表示所有字符,很多字符需要用两个char来表示

    UTF8编码

    编码方式指的是如何将字符转化为字节,同时将字节转化为字符;
    UTF8也是一种,将Ascii码字符转为1个字节,将汉字转为3个字节,通常存储和传输用的比较多。

    Java的getBytes()

    Bytes是8位整数,getBytes()即将字符通过UTF16编码为数字然后拆成8位Byte字节数组,Bytes是有符号的,所以会有负数。

     for (Byte b:"你".getBytes()) {
         System.out.println(b);
     }
     // -28
     // -67
     // -96
    
  • 相关阅读:
    用C#实现DES加密解密解决URL参数明文的问题
    C#数据集合分页处理
    图像处理中的hard negative mining(难例挖掘)
    目标检测最近
    Object Detection(目标检测神文)
    ssm框架整合基本步骤练习总结
    Android 数据存储之 SQLite数据库存储
    android内部存储与外部存储理解
    Android数据存储之SharePreference和内部存储
    AlertDialog和自定义对话框
  • 原文地址:https://www.cnblogs.com/Peter2014/p/12715448.html
Copyright © 2011-2022 走看看