【问题标题】:php exec output is getting truncade truncated because of accentsphp exec 输出由于重音而被截断
【发布时间】:2020-08-16 17:20:32
【问题描述】:

我正在 linux 服务器上构建一个网站,它可以使用 mkvmerge 命令行提供有关 mkv 文件的一些信息,但是在使用命令 $info = shell_exec("mkvmerge -J '".$chemin_fichier."'"); 时我遇到了一个大问题 当命令行的输出包含重音符号时,输出被截断:

预期输出:

{
  "container": {
    "properties": {
      "is_providing_timestamps": true,
      "title": "Le Bel Été 2019"
    },
    "type": "Matroska"
  }
}

实际输出:

{
  "container": {
    "properties": {
      "is_providing_timestamps": true,
      "title": "Le Bel

我确实在网上找到了我们需要修改环境的语言 [使用 putenv() 和 setlocale() ],我这样做了,但没有奏效。但是我可以使用重音来定义一些变量,所以这很奇怪。

无论如何,当我使用 wamp 服务器在我的计算机上运行相同的文件时,或者在我的 linux 服务器终端中运行相同的命令行时,我得到了正确的输出,所以我认为问题来自 php(7.3) 或 apache( 2.4)。

你有什么想法吗?请随时询问更多详细信息:)

【问题讨论】:

  • 您展示了一个有帮助的数据结构,但您未能展示源代码。我相信你很清楚这是一个编程网站。有人可能会说我应该“更好地”这样说。好的方法是你的问题在哪里?
  • 如果问题出在 Windows - 在 Windows 上,底层管道以文本模式打开,这可能导致函数无法进行二进制输出。考虑使用 popen() 代替这种情况。(来自shell_exec() 的手册)
  • @GetSet 没有更多的代码......唯一涉及的一行是我在帖子介绍中写下的那一行,即 $info = shell_exec("mkvmerge -J '".$chemin_fichier. "'")。
  • @NigelRen 我的问题是在 linux 上...但是在 windows 上,我运行完全相同的命令绝对没有问题 :-)
  • 那似乎是mkvmerge 的问题?作为程序员(您),您不能将文件重命名为mkvmerge 可以理解的合适格式吗?

标签: php exec encode diacritics truncated


【解决方案1】:

好的,我想通了!

实际上,语言“fr_FR.utf8”不适用于重音和特殊字符,而“en_US.utf8”似乎是唯一的解决方案。

我的服务器上的默认语言是 POSIX,它也不允许重音。

为了让事情顺利进行,请将以下几行放入您的 php 脚本中

$locale = 'en_US.utf8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多