【发布时间】:2020-10-09 13:32:00
【问题描述】:
我有一个 PHP 脚本,它应该返回一个 UTF-8 编码的字符串。但是,在 Java 中,我似乎无法以任何方式将它与它的内部字符串进行比较。
如果我打印 "OK" 和响应,它们在控制台中的显示相同。但是,如果我检查相等性
if ( "OK".equals(response) ) {
结果是假的。我用二进制打印出来,响应是11101111 10111011 10111111 01001111 01001011,Java 的字符串"OK" 但是是01001111 01001011,它是清晰的ASCII。我尝试通过几种方式将其转换为 UTF8,但无济于事:
String result2 = new String("OK".getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
和
String result2 = new String("OK".getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
两者都不起作用,由于某种原因仍然返回 ASCII 码。
byte[] result2 = "OK".getBytes(StandardCharsets.UTF_8); System.out.print(new String(result2));
虽然这也给出了正确的 "OK" 结果,但在二进制中它仍然返回 ASCII。
我尝试将通信改为数字,但 1 仍然不等于 1,因为 Integer.parseInt(response) 返回 "1" 不是字符串错误消息,尽管在其他方面,它是识别为普通字符串。
我正在寻找一个解决方案,最好将"OK" 转换为 UTF-8 而不是响应 ASCII,因为我需要与 PHP 脚本以及 2 个数据库进行通信,所有数据库都设置为 UTF-8。 Java 使用开关 -Dfile.encoding=UTF8 启动,以确保不破坏国家字符。
【问题讨论】:
-
01001111 01001011 既是 ASCII 又是 UTF-8。它也是 PHP 序列的最后两个字节。但是,PHP 序列另外包含三个字节 EF BB BF。它们是字节顺序标记 (BOM)。 BOM 在 UTF-16 和 UCS-32 中具有一定的价值。但在 UTF-8 中,它们基本上是无用的,令人讨厌,Unicode 标准建议不要这样做。在 PHP 端摆脱它。
-
response.subtring(1) 完美解决!
-
@kry 这不是一个解决方案。这是一种“解决方法”。因为它会让你的脚本在你真正修复错误之后停止工作。
-
@AterLux 我更担心从一开始就删除 BOM 实际上会破坏事情。数据库之间有很多双向通信,如果我删除 BOM,我可能需要检查所有地方的所有通信功能。 Java 创建的文件使用无 BOM 的 UTF-8,但我不认为其中的任何内容用于任何程序间通信。
-
@kry 请看我更新的答案