zoukankan      html  css  js  c++  java
  • java中Char到底是什么格式的编码

    文本处理中经常有这样的逻辑:

    String s = new String(bts, "UTF-8");

    看String源代码,里面是一个char[],将bts按照某种编码方式,变成了char[],不经有个疑问:

    使用UTF-8,UTF-16,ASIIC 等encode出来的char是相同的么?char是byte按照什么编码方式生成的呢?

    简单的办法,是看java序列化的实现方式,char最后是怎么序列化到byte[]中去的.

    ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeChar('A');

    看writeChar的内部实现

    public void writeChar(int val)  throws IOException {bout.writeChar(val);}    

    追到底层实现

    调用了BlockDataOutputStream.writeChar方法,在看这个方法的内部实现

    public void writeChar(int v) throws IOException {if (pos + 2 <= MAX_BLOCK_SIZE) {Bits.putChar(buf, pos, (char) v);pos += 2;} else {dout.writeChar(v);}}

    最终使用了Bits.putChar方法

    static void putChar(byte[] b, int off, char val) {b[off + 1] = (byte) (val      );b[off    ] = (byte) (val >>> 8);}

    好吧,看到这里就清楚了,用的是UTF-16BE(和UTF-16,UTF-16lE 不一样大端序编码方式。

    回到最初的问题上

    String s = new String(bts, "UTF-8");

    这行代码的含义是什么呢?

    是将bts按照UTF-8编码的方式获取到unicode的pointcode (就是unicode定义字符的序号),然后再将这个pointcode按照utf-16be的方式编码成char. //最终的实现方式,可能有差异,但是结果是没错滴^^

  • 相关阅读:
    leetcode 15. 三数之和
    leetcode 168. Excel表列名称
    142. 环形链表 II
    144. 二叉树的前序遍历(非递归)
    415. 字符串相加
    剑指 Offer 31. 栈的压入、弹出序列
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 29. 顺时针打印矩阵
    剑指 Offer 10- II. 青蛙跳台阶问题
    VBA 实现excel单元格多选
  • 原文地址:https://www.cnblogs.com/crazylqy/p/10481821.html
Copyright © 2011-2022 走看看