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, 0xBFBOM (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);
  }