我正在尝试将一个UTF-8字符串作为命令行参数从PHP传递给一个Java程序。当我在PHP调试器中查看字符串时,它正确显示:
但是,当我查看Java调试器中的arg数据(以及传递回PHP程序的返回值)时,我看到:
我已经尝试了下面的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);发布于 2021-07-20 00:52:34
已使用此处提供的解决方案解决此问题:
每个人的帮助让我走上了正确的道路。这确实是一个语言环境问题,但不是操作系统层面的问题。取而代之的是PHP的语言环境。
另一个用户遇到了类似的问题,通过在执行调用Java程序的命令行之前将以下代码添加到PHP脚本中,修复了该问题:
$locale = 'en_US.utf-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);现在,在Java代码中,当我查看args参数时,它现在可以正确显示,并且处理后的文本存储在一个文件中,然后正确地发送和接收到PHP脚本。我花了一点时间查找字节值、相应的UTF-8编码等等,然后我才开始发现问题是PHP在exec()调用过程中将exec之前的正确字符串转换成了不同的字符串。在此调用期间,将UTF-8 \0xc3 0xa9字节的"é“(Unicode \u00E9)转换为\3f \3f (两个ASCII问号字符)。
在我搜索stackoverflow时,我看到了一个警告,而不是使用文字(例如"Présentation"),当我回溯数据到调用者时,很明显这个问题涉及到对exec()的实际调用。
希望Unicode处理的另一个新手可以从这些信息中受益。
感谢大家的投入,为我指明了正确的方向。
https://stackoverflow.com/questions/68434497
复制相似问题