【问题标题】:String comparision in UTF8UTF8 中的字符串比较
【发布时间】: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 请看我更新的答案

标签: java string utf-8


【解决方案1】:

在 UTF-8 中,所有代码为 127 或更少的字符都由单个字节编码。因此"OK"在UTF-8和ASCII中是相同的两个字节。

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);
  }

【讨论】:

  • response.charAt(1) 运行为 FALSE。我尝试以各种方式重新创建 BOM,但它们也不起作用。 response.substring(1) 单独作为一种解决方法。
  • @kry 应该是charAt(0),但老实说,正确的解决方案是首先不发送 BOM。
  • @kry 对不起,我的错。它是 charAt(0)
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多