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. //最终的实现方式,可能有差异,但是结果是没错滴^^

 

posted @   crazyYong  阅读(1477)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2015-03-06 SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2015-03-06 开涛spring3(9.4) - Spring的事务 之 9.4 声明式事务
点击右上角即可分享
微信分享提示