Java String.codePointAt 返回意外值

标签 java string encoding

如果我使用从 33 到 127 的任何 ASCII 字符,codePointAt 方法会给出正确的十进制值,例如:

String s1 = new String("#");
int val = s1.codePointAt(0);

这将返回 35,这是正确的值。

但是如果我尝试使用从 128 到 255 的 ASCII 字符(扩展的 ASCII/ISO-8859-1),此方法会给出错误的值,例如:

String s1 = new String("ƒ")  // Latin small letter f with hook
int val = s1.codePointAt(0);

这应该根据 this reference table 返回 159 ,而是返回 409,这是为什么?

最佳答案

But if I try use ASCII characters from 128 to 255

ASCII 没有此范围内的值。它只使用 7 位。

Java 字符是 UTF-16(仅此而已!)。如果要用Java表示ASCII,就需要使用字节数组。

codePointAt 方法返回 32 位代码点。 16 位字符不能包含整个 Unicode 范围,因此一些代码点必须分成两个字符(根据 encoding scheme for UTF-16 )。 codePointAt 方法有助于解析字符代码点。

我写了一个粗略的 Java 编码指南 here .

关于Java String.codePointAt 返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3948876/

相关文章:

Java NetBeans 连接到 MS Access 数据库错误

c - 在 printf 语句中使用 strcpy 或 strcat 时,是否会对字符串进行不必要的更改?

c - 为什么当我超出另一个数组的边界时 printf() 的输出会发生变化?

node.js - 如何在 Node.js 中为请求编码任意字符串?

python - Python 编码问题

java - 如果抛出异常,测试会失败吗?

java - 存储 box 或 dropbox 文件

c++ - 最大长度的字符串前缀同构

encoding - 运行 Tensorflow2 升级脚本触发编码错误

java - 传输和存储数据的安全方式