[英]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, 0xBF
是BOM(字节顺序标记)
它是编辑器不显示但用于确定编码的符号。
可能那些符号出现在你的 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.