Java: Implementation of PHP's ord() yields different results for chars beyond ASCII
我正在尝试编写一个相当于PHP的EDCOX1第0章的Java:
1 2 3 4 5 6 7 | public static int ord(char c) { return (int) c; } public static int ord(String s) { return s.length() > 0 ? ord(s.charAt(0)) : 0; } |
对于顺序值高达
To elaborate, the reason é showed ASCII 195 is because it's actually a two-byte character (UTF-8), the first byte of which is ASCII 195. – Mr. Llama
因此,我修改了我的
1 2 3 | public static int ord(char c) { return (int) (c & 0xFF); } |
不过,结果不同。两个例子:
ord('é') (U+0E9)在PHP中给出EDCOX1,2,而我的Java函数产生EDCOX1〔6〕。ord('?') (U+2E06)在PHP中给出EDCOX1,8,而我的Java函数产生EDCOX1〔9〕。
我试图通过首先将
1 2 3 | public static int ord(String s) { return s.length() > 0 ? ord((char)s.getBytes(StandardCharsets.UTF_8)[0]) : 0; } |
但是,使用接受
- 如何使我的函数行为类似于PHP?
- 为什么对
ord(String s) 的更改实际上有效?
解释性的答案是非常感谢的,因为我想知道到底发生了什么。
在爪哇中,EDCOX1×0是UTF 16编码单元。将utf-16转换成utf-8不仅仅是
最简单的方法是反转两个重载,因为
1 2 3 | public static int ord(String s) { return s.length() > 0 ? (s.getBytes(StandardCharsets.UTF_8)[0] & 0xff) : 0; } |
将
1 2 3 |
虽然这是可行的,但由于不必要的char→string→int转换,所以效率不高。Unicode码位
1 2 3 4 5 6 7 8 9 | if (c < 0x80) { return c; } else if (c < 0x800) { return 0xc0 | c >> 6; } else if (c < 0x10000) { return 0xe0 | c >> 12; } else { return 0xf0 | c >> 18; } |
您可能还想读取什么是unicode、utf-8、utf-16?获取一些背景信息。