【问题标题】:The php middot mysteryphp 中点之谜
【发布时间】:2018-01-14 14:21:45
【问题描述】:

我有一个通过 PHP exec 调用的 Java 应用程序。 Java在命令行显示中点:“·”

但是当在 utf-8 html 页面中从 PHP 调用代码时,我有一个“?”而不是“·”。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <form method="post" action="essai2.php">
            <input type="text" name="texte" />
            <input type="submit" value="Valider" />
        </form>
        <?php 
            echo "input text : ".$_POST['texte'];
            exec("/usr/bin/java -jar runner.jar ".$_POST['texte'], $variable);
            echo "<br>output text : ".$variable[0];
        ?>
    </body>
</html>

有什么线索吗? (我试过htmlentities,htmlspecialchars。命令行上的文本文件是utf-8)

为了更好地理解这个问题: 在命令行我做

java -jar runner.jar "le agriculteur est mort"

我明白了

[le·la, agriculteur·trice, est, mort]

在网络服务器上我得到

[le?la, agriculteur??trice, est, mort]

所有这些的十六进制代码(遵循 Rick James 的评论)是:

5b6c653f6c612c206167726963756c746575723f3f74726963652c206573‌​742c206d6f72745d

希望对你有帮助

【问题讨论】:

  • 该代码中的中间点在哪里??
  • 应该在变量“$variable[0]”中
  • 所以我根据stackoverflow.com/questions/1605760/…修改了php.ini和apache conf,但没有结果。 ://
  • echo bin2hex($variable[0]);
  • var_dump($variable) => array(1) { [0]=> string(38) "[le?la, agriculteur??trice, est, mort]" } echo bin2hex($变量[0]); => 5b6c653f6c612c206167726963756c746575723f3f74726963652c206573742c206d6f72745d

标签: php unicode


【解决方案1】:

好的,由于某种原因 php exec 更改了语言环境。 所以答案根据PHP exec change encoding

是在执行 exec 之前设置语言环境:

$locale='fr_FR.UTF-8';
setlocale(LC_ALL,$locale);
putenv('LC_ALL='.$locale);

然后瞧!!

【讨论】:

    【解决方案2】:

    如果您以十六进制 B7 开头,但以 ? (3F) 结尾,那可能是因为文本是在 latin1(或 cp1250、cp1251、cp1256、cp1257、dec8 中的任何一个)中编码的, geostd8, greek, hebrew, latin5, latin7), n 被视为 UTF-8。 B7 不是任何 utf8 字符的有效首字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2020-02-23
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2010-12-22
      • 2018-03-13
      相关资源
      最近更新 更多