如何将 UTF-8 命令行数据从 PHP 发送到 Java 以进行正确编码
How to send UTF-8 command line data from PHP to Java for correct encoding
我正在尝试将 UTF-8 字符串作为命令行参数从 PHP 传递到 Java 程序。
当我在 PHP 调试器中查看字符串时,它正确显示:Présentation
然而,当我查看 Java 调试器中的 arg[0] 数据(以及传回给 PHP 程序的 returned 值)时,我看到:Pr? ?陈述
我已经尝试了下面的 Java 代码,但 ISO_8859_1 和 UTF_8 return 都没有正确的结果。
我已经在 Whosebug (Translate UTF-8 character encoding function from PHP to Java) 以及其他网站上查看过这里,但仍然无法进行
意识到我做错了什么。
在 PHP 中找到的一切似乎都有效,但 Java 从一开始就对数据进行了正确的处理,这些数据看起来可能需要在我调用下面的代码之后或之前进行额外处理。
这是我第一次尝试处理国际字符。任何帮助是极大的赞赏。谢谢!
编辑:我在 Windows 上远程调试 - PHP 和 Java 在 Ubuntu 系统上 运行。但是由于 PHP 代码和从 PHP 代码调用的 Java 代码驻留在基于 linux 的系统上,因此 Windows 命令行应该没有任何问题Java 和 UTF-8。我在 Whosebug 上读到过,这在最近对某些人来说是个问题。
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
大家的帮助让我走上了正轨。这确实是一个语言环境问题,但不是在 OS 级别。相反,它是 PHP 的语言环境。
另一个用户遇到了类似的问题,通过在执行调用 Java 程序的命令行之前将以下代码添加到 PHP 脚本来解决此问题:
$locale = 'en_US.utf-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
所以现在,在 Java 代码中,当我查看 args[0] 参数时,它现在可以正确显示,并且处理过的文本也存储在文件中,然后发送回并接收到PHP 脚本正确。在我开始看到问题是 PHP 正在将 exec 之前的正确字符串转换为不同的字符串之前,我花了一些时间查找字节值、相应的 UTF-8 编码等在 exec() 调用期间。在此调用期间,“é”(Unicode \u00E9)的 UTF-8 \0xc3 0xa9 字节转换为 \3f \3f(两个 ASCII 问号字符)。
在 Whosebug 上搜索期间,我看到了一个警告,而不是使用文字(例如“Présentation”),一旦我将数据回溯给调用者,很明显问题涉及对 exec() 的实际调用。
希望 Unicode 处理的新手可以从这些信息中受益。
感谢大家的意见,为我指明了正确的方向。
我正在尝试将 UTF-8 字符串作为命令行参数从 PHP 传递到 Java 程序。 当我在 PHP 调试器中查看字符串时,它正确显示:Présentation
然而,当我查看 Java 调试器中的 arg[0] 数据(以及传回给 PHP 程序的 returned 值)时,我看到:Pr? ?陈述
我已经尝试了下面的 Java 代码,但 ISO_8859_1 和 UTF_8 return 都没有正确的结果。
我已经在 Whosebug (Translate UTF-8 character encoding function from PHP to Java) 以及其他网站上查看过这里,但仍然无法进行 意识到我做错了什么。
在 PHP 中找到的一切似乎都有效,但 Java 从一开始就对数据进行了正确的处理,这些数据看起来可能需要在我调用下面的代码之后或之前进行额外处理。
这是我第一次尝试处理国际字符。任何帮助是极大的赞赏。谢谢!
编辑:我在 Windows 上远程调试 - PHP 和 Java 在 Ubuntu 系统上 运行。但是由于 PHP 代码和从 PHP 代码调用的 Java 代码驻留在基于 linux 的系统上,因此 Windows 命令行应该没有任何问题Java 和 UTF-8。我在 Whosebug 上读到过,这在最近对某些人来说是个问题。
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
大家的帮助让我走上了正轨。这确实是一个语言环境问题,但不是在 OS 级别。相反,它是 PHP 的语言环境。
另一个用户遇到了类似的问题,通过在执行调用 Java 程序的命令行之前将以下代码添加到 PHP 脚本来解决此问题:
$locale = 'en_US.utf-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
所以现在,在 Java 代码中,当我查看 args[0] 参数时,它现在可以正确显示,并且处理过的文本也存储在文件中,然后发送回并接收到PHP 脚本正确。在我开始看到问题是 PHP 正在将 exec 之前的正确字符串转换为不同的字符串之前,我花了一些时间查找字节值、相应的 UTF-8 编码等在 exec() 调用期间。在此调用期间,“é”(Unicode \u00E9)的 UTF-8 \0xc3 0xa9 字节转换为 \3f \3f(两个 ASCII 问号字符)。
在 Whosebug 上搜索期间,我看到了一个警告,而不是使用文字(例如“Présentation”),一旦我将数据回溯给调用者,很明显问题涉及对 exec() 的实际调用。
希望 Unicode 处理的新手可以从这些信息中受益。
感谢大家的意见,为我指明了正确的方向。