【问题标题】:How to send UTF-8 command line data from PHP to Java for correct encoding如何将 UTF-8 命令行数据从 PHP 发送到 Java 以进行正确编码
【发布时间】: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


【解决方案1】:

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

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 之前将正确的字符串转换为不同的字符串( ) 称呼。在此调用期间,将“é”(Unicode \u00E9)的 UTF-8 \0xc3 0xa9 字节转换为 \3f \3f(两个 ASCII 问号字符)。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多