【发布时间】:2021-09-26 18:19:03
【问题描述】:
我正在尝试将 UTF-8 字符串作为命令行参数从 PHP 传递给 Java 程序。 当我在 PHP 调试器中查看字符串时,它正确显示:Présentation
然而,当我查看 Java 调试器中的 arg[0] 数据(以及返回给 PHP 程序的返回值)时,我看到:Pr??sentation
我尝试了下面的 Java 代码,但 ISO_8859_1 和 UTF_8 都没有返回正确的结果。
我在 stackoverflow (Translate UTF-8 character encoding function from PHP to Java) 以及其他网站上查看过这里,但仍然无法制作 感觉我做错了什么。
在 PHP 中似乎一切正常,但 Java 从一开始就在做一些事情,数据看起来可能需要在我调用下面的代码之后或之前进行额外处理。
这是我第一次处理国际字符。任何帮助是极大的赞赏。谢谢!
编辑:我在 Windows 上远程调试 - PHP 和 Java 正在 Ubuntu 系统上运行。但是由于 PHP 代码和从 PHP 代码调用的 Java 代码驻留在基于 linux 的系统上,因此 Windows 命令行 Java 和 UTF-8 应该没有任何问题。我在 stackoverflow 上读到了这里,这对最近的一些人来说是个问题。
byte[] test_str_1 = args[0].getBytes(StandardCharsets.ISO_8859_1);
System.out.println(test_str_1);
byte[] test_str_2 = args[0].getBytes(StandardCharsets.UTF_8);
System.out.println(test_str_2);
【问题讨论】:
-
一种更常见的方法是让 Java 应用程序运行某种 Web API 并避免 shell 调用,因为存在许多可能使您的系统非常脆弱的安全陷阱。至少虽然我认为我们需要查看 PHP - 那里的代码 sn-p 不是很有帮助:)
-
“当我查看时”和“我正在远程调试 Windows”。那里有巨大的红旗。许多终端,尤其是 Windows,都很难使用编码。在修复之前确保您确实遇到了问题。
-
感谢您的意见。首先,我应该提到这是针对范围有限的私有 Intranet 应用程序。无法从网络访问网络,安全性不是问题。 PHP 代码没有问题,可以是任何调用应用程序(在这种情况下,发送的字符串确实是 UTF-8 字符串,如上所示)。我可以将该字符串剪切并粘贴到 Linux 命令行中,并且得到相同的结果。唯一缺少的代码是我收到 arg[0] 字符串的地方,这就是为什么我只包含上面的相关代码。
-
关于 Windows 应用程序 - 起初我确实认为这可能是问题所在。但是字符串在 PHP 调试器中很好,并且它和 IntelliJ 的设计相似,并且可以在同一台机器上一起运行。所以(只是一个猜测)我认为这两个 JetBrains 程序都可以正常工作(事实上,两者都可以很好地在两个程序之间打断点以及正确显示其他变量)。似乎这与如何在 Java 中运行一次转换有关。
-
您的 Ubuntu 机器设置为什么语言环境?可能是您的 shell 的语言环境导致了编码问题。一种选择是写入标准输入,它在 Java 中显示为原始字节流,您可以在其上显式使用 utf8 阅读器。
标签: java php utf-8 iso-8859-1