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. //最终的实现方式,可能有差异,但是结果是没错滴^^
java中Char到底是什么格式的编码的更多相关文章
- 关于java中char占几个字节,汉字占几个字节
我们平常说,java中char占2个字节,可又说汉字在不通的编码格式中所占的位数是不同的,比如gbk中汉字占2个字节,utf8中多数占3个字节,少数占4个.而所有汉字在java程序中我们都可以简单的用 ...
- 一段代码了解Java中char和int的转换
题目要求: 将输入的大写字母转成对应小写的后5个,如A转换后为f:如果转换后大于z则从a重新计,即多出1就转成a,多出2就转成b以此类推. Java代码: ```java private static ...
- Java中char和String的相互转换
转自:http://blog.csdn.net/yaokai_assultmaster/article/details/52082763 Java中char是一个基本类型,而String是一个引用类型 ...
- Java中char转为16进制
Java中char转为16进制 char a = '0'; String hexStr = Integer.toHexString(a); System.out.println(hexStr);
- Java中char占用几个字节
在讨论这个问题之前,我们需要先区分unicode和UTF. unicode :统一的字符编号,仅仅提供字符与编号间映射.符号数量在不断增加,已超百万.详细:[https://zh.wikipedia. ...
- Java中char和String 的深入理解 - 字符编码
开篇 https://blog.csdn.net/weixin_37703598/article/details/80679376 我们并不是在写代码,我们只是将自己的思想通过代码表达出来! 1 将思 ...
- JAVA中char和String/值类型和引用类型的区别
import java.util.*; class test { public static void main(String[] args) { char a[] = {'b', 'a', 'c'} ...
- 加深关于Java中char类型的理解
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- java中驼峰与下横线格式字符串互转算法
public static final char UNDERLINE = '_'; /** * 驼峰格式字符串转换为下划线格式字符串 * * @param param * @return */ pub ...
随机推荐
- JPA的初级CRUD-01
一.JPA 1.1 什么是JPA JPA:(Java Persistence API) ORM的规范 JPA是规范,Hibernate是它的实现(不唯一,但最好) 最底层的操作还是JDBC(引入驱动包 ...
- laravel 打印完整sql
DB::connection()->enableQueryLog(); // 开启QueryLog \App\User::find(1); dump(DB::getQueryLog());
- #pragma常用预处理指令
#pragma pack(1):1字节对齐#pragma once:指定头文件被编译一次#pragma message("message"):编译时输出message文本#prag ...
- 恢复git撤销commit的代码
使用git reset --hard 是将磁盘文件也删除 时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 reset, rebase 和 merge.甚至一些很小的操作,例如删除一个分支 ...
- rest_framework登录组件,权限组件
昨日回顾: -HyperlinkedIdentityField(用来生成url),传三个参数 -实例化序列化类的时候,BookSerializer(ret, many=True, context={' ...
- log4j的添加顺序
1.log4j的架包 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api&l ...
- cordova 问题汇总
用chrome进行调试: https://jingyan.baidu.com/album/db55b609fde96d4ba30a2fa9.html?picindex=8 http://rensann ...
- Node.js创建本地简易服务器
创建简易的本地服务器 安装node.js 在项目下,通过npm init -y创建package.json文件 通过npm install mime --save加载mime插件 创建server.j ...
- one-to-one 一对一映射关系(转 wq群)
2.配置对应的xml配置文件 person的配置文件 idCard的配置文件 idCard的配置文件 3.测试 运行测试程序后,控制台输出两条语句
- Python基础-数据类型-转摘
1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和(2.3-4. ...