UTF8 中的字符串比较
String comparision in UTF8
我有一个 PHP 脚本,它应该 return 一个 UTF-8 编码的字符串。但是,在 Java 中,我似乎无法以任何方式将它与它的内部字符串进行比较。
如果我打印 "OK"
和响应,它们在控制台中显示相同。但是,如果我检查 equality
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);
两者都不起作用,出于某种原因仍然 return ASCII 代码。
byte[] result2 = "OK".getBytes(StandardCharsets.UTF_8); System.out.print(new String(result2));
虽然这也给出了正确的 "OK"
结果,但在二进制中它仍然是 returns ASCII。
我已经尝试将通信更改为数字,但 1
仍然不等于 1
,因为 Integer.parseInt(response)
returns "1"
不是String错误信息,虽然在其他方面,它被识别为一个正常的String。
我正在寻找一种解决方案,最好将 "OK"
转换为 UTF-8 而不是响应 ASCII,因为我需要与 PHP 脚本以及 2 个数据库进行通信,所有设置为 UTF-8。 Java 由开关 -Dfile.encoding=UTF8
启动以确保国家字符不被破坏。
在 UTF-8 中,所有代码为 127 或更小的字符都由单个字节编码。因此UTF-8和ASCII中的"OK"
是相同的两个字节。
11101111 10111011 10111111 01001111 01001011 这不只是简单 "OK"
它是
0xEF, 0xBB, 0xBF, "OK"
其中 0xEF, 0xBB, 0xBF
是 BOM (Byte order mark)
是编辑器不显示但用于确定编码的符号。
可能这些符号在 <?php
之前出现在您的 php 脚本中
您必须将编辑器配置为从文件中删除 BOM
UPD
如果无法更改 php 脚本,您可以使用解决方法:
// check if the first symbol of the response is BOM
if (!response.isEmpty() && (response.charAt(0) == 0xFEFF)) {
// removing the first symbol
response = response.substring(1);
}
我有一个 PHP 脚本,它应该 return 一个 UTF-8 编码的字符串。但是,在 Java 中,我似乎无法以任何方式将它与它的内部字符串进行比较。
如果我打印 "OK"
和响应,它们在控制台中显示相同。但是,如果我检查 equality
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);
两者都不起作用,出于某种原因仍然 return ASCII 代码。
byte[] result2 = "OK".getBytes(StandardCharsets.UTF_8); System.out.print(new String(result2));
虽然这也给出了正确的 "OK"
结果,但在二进制中它仍然是 returns ASCII。
我已经尝试将通信更改为数字,但 1
仍然不等于 1
,因为 Integer.parseInt(response)
returns "1"
不是String错误信息,虽然在其他方面,它被识别为一个正常的String。
我正在寻找一种解决方案,最好将 "OK"
转换为 UTF-8 而不是响应 ASCII,因为我需要与 PHP 脚本以及 2 个数据库进行通信,所有设置为 UTF-8。 Java 由开关 -Dfile.encoding=UTF8
启动以确保国家字符不被破坏。
在 UTF-8 中,所有代码为 127 或更小的字符都由单个字节编码。因此UTF-8和ASCII中的"OK"
是相同的两个字节。
11101111 10111011 10111111 01001111 01001011 这不只是简单 "OK"
它是
0xEF, 0xBB, 0xBF, "OK"
其中 0xEF, 0xBB, 0xBF
是 BOM (Byte order mark)
是编辑器不显示但用于确定编码的符号。
可能这些符号在 <?php
您必须将编辑器配置为从文件中删除 BOM
UPD
如果无法更改 php 脚本,您可以使用解决方法:
// check if the first symbol of the response is BOM
if (!response.isEmpty() && (response.charAt(0) == 0xFEFF)) {
// removing the first symbol
response = response.substring(1);
}