如何将 UTF-8 命令行数据从 PHP 发送到 Java 以进行正确编码

问题描述

我正在尝试将 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);

解决方法

问题已使用此处提供的解决方案解决:

Unicode to PHP exec

大家的帮助让我走上了正轨。这确实是一个语言环境问题,但不是在操作系统级别。相反,它与 PHP 的语言环境有关。

另一个用户遇到了类似的问题,在执行调用 Java 程序的命令行之前,通过将以下代码添加到 PHP 脚本中来解决此问题:

$locale = 'en_US.utf-8';
setlocale(LC_ALL,$locale);
putenv('LC_ALL='.$locale);

现在,在 Java 代码中,当我查看 args[0] 参数时,它现在可以正确显示,处理后的文本也存储在文件中,然后正确发送回并接收到 PHP 脚本中。在我开始看到问题之前,我需要查找字节值、相应的 UTF-8 编码等,因为 PHP 正在将 exec 之前的正确字符串转换为 exec 期间的不同字符串( ) 称呼。在此调用期间,将“é”(Unicode \u00E9)的 UTF-8 \0xc3 0xa9 字节转换为 \3f \3f(两个 ASCII 问号字符)。

在我在 stackoverflow 上搜索时,我看到了一个警告,而不是使用文字(例如“Présentation”),一旦我将数据回溯到调用者,很明显问题涉及对 exec() 的实际调用。

希望 Unicode 处理的另一个新手可以从这些信息中受益。

感谢大家的意见,为我指明了正确的方向。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...