Java String.codePointAt返回意外值

Java String.codePointAt返回意外值,java,string,encoding,Java,String,Encoding,如果我使用33到127之间的任何ASCII字符,codePointAt方法会给出正确的十进制值,例如: String s1 = new String("#"); int val = s1.codePointAt(0); String s1 = new String("ƒ") // Latin small letter f with hook int val = s1.codePointAt(0); 这将返回正确值35 但如果我尝试使用128到255个扩展ASCII/ISO-8859-1的A

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

String s1 = new String("#");
int val = s1.codePointAt(0);
String s1 = new String("ƒ")  // Latin small letter f with hook
int val = s1.codePointAt(0);
这将返回正确值35

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

String s1 = new String("#");
int val = s1.codePointAt(0);
String s1 = new String("ƒ")  // Latin small letter f with hook
int val = s1.codePointAt(0);
这应该按照返回159,但返回409,这是为什么

但是如果我尝试使用128到255之间的ASCII字符

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

Java字符是UTF-16而不是别的!。如果要使用Java表示ASCII,则需要使用字节数组

codePointAt方法返回32位代码点。16位字符不能包含整个Unicode范围,因此某些代码点必须按照。codePointAt方法有助于解析chars代码点

我写了一本Java编码的粗略指南

但是如果我尝试使用128到255之间的ASCII字符

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

Java字符是UTF-16而不是别的!。如果要使用Java表示ASCII,则需要使用字节数组

codePointAt方法返回32位代码点。16位字符不能包含整个Unicode范围,因此某些代码点必须按照。codePointAt方法有助于解析chars代码点


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

Java字符不是用ISO-8859-1编码的。它们使用UTF-16,该UTF-16的值与7位ASCII字符的值相同,只有0-127之间的值

要获得ISO-8859-1的正确值,必须将字符串转换为一个字节[],并带有string.getBytesISO-8859-1;然后查看字节数组

更新


ISO-8859-1不是编码,使用String.getBytesCp437;以获得正确的值

Java字符未在ISO-8859-1中编码。它们使用UTF-16,该UTF-16的值与7位ASCII字符的值相同,只有0-127之间的值

要获得ISO-8859-1的正确值,必须将字符串转换为一个字节[],并带有string.getBytesISO-8859-1;然后查看字节数组

更新

ISO-8859-1不是编码,使用String.getBytesCp437;以获得正确的值

Unicode中的

ƒ 0x0192 LATIN SMALL LETTER F WITH HOOK
使用Unicode

ƒ 0x0192 LATIN SMALL LETTER F WITH HOOK
返回此指定索引处的Unicode代码点

ƒ的Unicode码点是402,请参阅

所以

打印402是正确的

如果您对其他字符集中的表示感兴趣,可以通过以下方式打印其他字符集中字符的字节表示:

返回此指定索引处的Unicode代码点

ƒ的Unicode码点是402,请参阅

所以

打印402是正确的

如果您对其他字符集中的表示感兴趣,可以通过以下方式打印其他字符集中字符的字节表示:


你的参考表很差。它被称为扩展ASCII,这没有多大意义,因为有无数不同的字符集都可以被称为扩展ASCII。它至少应该说明它是关于什么字符集的。在这里您可以找到有关哪些字符集和代码页支持此字符的信息。您的参考表非常糟糕。它被称为扩展ASCII,这没有多大意义,因为有无数不同的字符集都可以被称为扩展ASCII。它至少应该说明它是关于什么字符集的。在这里可以找到有关哪些字符集和代码页支持此字符的信息。ISO-8859-1中没有表示“ƒ”,因此getBytes的结果未定义。在某些实现中,它只返回“?”的字节。@Michael Konietzka很高兴知道,我没有检查编码。“ƒ”在ISO-8859-1中没有表示,因此getBytes的结果未定义。在某些实现中,它只返回“?”的字节。@Michael Konietzka很高兴知道,我没有检查编码。