gpt4 book ai didi

java - 如何建立编码字符的代码点?

转载 作者:行者123 更新时间:2023-11-29 05:50:10 25 4
gpt4 key购买 nike

给定字节流(表示字符)和流的编码,我将如何获得字符的代码点?

InputStreamReader r = new InputStreamReader(bla, Charset.forName("UTF-8"));
int whatIsThis = r.read();

上面代码片段中 read() 返回了什么?是 unicode 代码点吗?

最佳答案

Reader.read()返回一个可以转换为 char 或 -1(如果没有更多数据可用)的值。

char 是(隐含地)UTF-16BE 编码中的 16 位代码单元。这种编码可以用单个 char 表示基本的多语言平面字符。 supplementary range使用两个 char 序列表示。

Character类型包含将 UTF-16 代码单元转换为 Unicode 代码点的方法:

需要两个 char 的代码点将满足 isHighSurrogateisLowSurrogate当您从 sequence 传入两个连续值时. codePointAt方法可用于从代码单元序列中提取代码点。从代码点到 UTF-16 代码单元有类似的方法。


代码点流阅读器的示例实现:

import java.io.*;
public class CodePointReader implements Closeable {
private final Reader charSource;
private int codeUnit;

public CodePointReader(Reader charSource) throws IOException {
this.charSource = charSource;
codeUnit = charSource.read();
}

public boolean hasNext() { return codeUnit != -1; }

public int nextCodePoint() throws IOException {
try {
char high = (char) codeUnit;
if (Character.isHighSurrogate(high)) {
int next = charSource.read();
if (next == -1) { throw new IOException("malformed character"); }
char low = (char) next;
if(!Character.isLowSurrogate(low)) {
throw new IOException("malformed sequence");
}
return Character.toCodePoint(high, low);
} else {
return codeUnit;
}
} finally {
codeUnit = charSource.read();
}
}

public void close() throws IOException { charSource.close(); }
}

关于java - 如何建立编码字符的代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com