繁体   English   中英

UTF8 中的字符串比较

[英]String comparision in UTF8

我有一个 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确保国家字符不被破坏。

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

11101111 10111011 10111111 01001111 01001011 这不仅仅是简单的"OK" ,它是

0xEF, 0xBB, 0xBF, "OK"

其中0xEF, 0xBB, 0xBFBOM(字节顺序标记)

它是编辑器不显示但用于确定编码的符号。

可能那些符号出现在你的 php 脚本之前<?php

您必须配置编辑器以从文件中删除 BOM

更新程序

如果无法更改 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);
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM