java中Char到底是什么格式的编码

发布网友 发布时间:2022-04-24 02:58

我来回答

1个回答

热心网友 时间:2023-10-23 08:48

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

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大端序编码方式。

回到最初的问题上

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

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

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

热心网友 时间:2023-10-23 08:48

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

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大端序编码方式。

回到最初的问题上

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

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

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

热心网友 时间:2023-10-23 08:48

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

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大端序编码方式。

回到最初的问题上

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

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

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

热心网友 时间:2023-11-14 09:46

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

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大端序编码方式。

回到最初的问题上

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

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

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com