【问题标题】:PHP UTF-8 to Windows command line encodingPHP UTF-8 到 Windows 命令行编码
【发布时间】:2010-12-11 15:28:10
【问题描述】:

一切都在问题中:我有一个 UTF-8 文件的 PHP 脚本。 在这个脚本中,我想这样做:

  <?
  echo "âêïû\n";
  ?>

如果我在 Windows 提示符下运行它,我会得到:

C:\php>php -c C:\WINDOWS\php.ini -f mysqldump.php
âêïû
C:\php>

我一直未能找到正确的转换方案。我也试过这段代码:

$tab = mb_list_encodings();
foreach ($tab as $enc1) {
  foreach ($tab as $enc2) {
    $t=mb_convert_encoding("âêïû\n", $enc1, $enc2);
    if (strlen($t)<14) {
      echo $enc1." ".$enc2." = ".$t."\n";
    }
  }
}

而且我没有找到正确的转换!

任何帮助将不胜感激

【问题讨论】:

    标签: php windows command-line cmd character-encoding


    【解决方案1】:

    再试试这个。它适用于俄语编码,我希望它适用于法语:

    class ConsoleHelper
    {
        /**
         * @var boolean
         */
        private static $isEncodingSet = false;
    
        /**
         * @param string $message
         * @return string
         */
        public static function encodeMessage($message)
        {
            $isWindows = (DIRECTORY_SEPARATOR == '\\');
            if ($isWindows) {
                if ( ! self::$isEncodingSet) {
                    shell_exec('chcp 866');
                    self::$isEncodingSet = true;
                }
                $message = iconv('utf-8', 'cp866', $message);
            }
            return $message;
        }
    }
    

    【讨论】:

    • 您使用的是866,我猜法语是1252。无论如何,我在 6 年前就放弃了 Windows,我很高兴我永远切换到 Linux Mint(当然,除了一些游戏)。礼貌地说,Windows 不再是我的一杯茶了。当然,当我谈论它时,我会更加粗鲁。这里礼貌很重要&lt;8^D
    • 法语是 cp850。
    【解决方案2】:

    看起来默认编码是Code page 437

    【讨论】:

      【解决方案3】:

      问题是 Windows cmd 行默认不支持 UTF8。从这个link,如果你关注这些

      1. 打开命令提示符窗口
      2. 更改窗口的属性以使用默认光栅字体以外的其他内容。他的 Lucida Console True Type 字体似乎运行良好。
      3. 从命令提示符运行“chcp 65001”

      你应该可以输出utf8。

      【讨论】:

      • +1 很高兴知道您可以在 shell 中更改编码
      • 好的,我试过“chcp 65001”。现在,每次我运行“php -c C:\WINDOWS\php.ini -f mysqldump.php | more”时,都会出现“内存不足错误”。然后我尝试不使用“| more”(这对 Windows 来说太冒险了,我猜 grrr)并且脚本在开始时自行停止......
      • 你能试试“echo 'hello world';”吗?
      • 请注意,Windows 命令行的默认字符集是NOT ISO-8859-1 而是 Windows-1252(至少对于 Latin1/西欧)。
      • chcp 65001 是一个 hack,不支持完整的 UTF-8 或多字节输入
      【解决方案4】:

      你让我走上了正确的道路,但有一点问题(我喜欢 Windows \o/):

      C:\php>chcp 65001
      Page de codes active : 65001
      C:\php>php -c C:\WINDOWS\php.ini -f mysqldump.php | more
      Mémoire insuffisante.
      

      Mémoire insuffisante = 内存不足。

      如果我尝试

      C:\php>chcp 1252
      C:\php>php -c C:\WINDOWS\php.ini -f mysqldump.php
      C:\php>ééîîïïÂÂÂÂâûü
      

      它有效。只有上帝知道为什么。但它有效。感谢您让我走上正轨!!

      顺便说一句,将 UTF8 正确转换为命令提示符的 php 代码是:

        echo mb_convert_encoding($utf8_string, "pass", "auto");
      

      【讨论】:

      • µ是的,我确定,我在 www.acarat.com 上使用它,它是完整的 utf-8 站点
      • 上帝不知道为什么!
      • BTW 附加到末尾为我省去了很多麻烦,因为mb_convert_encoding($utf8_string, "pass", "auto") 也是在 Windows 中本地读取/写入 UTF-8 命名文件的方式。
      • @lalengua 第二个参数"pass" 是什么意思?我发现第三个只有"auto":“auto”扩展为“ASCII,JIS,UTF-8,EUC-JP,SJIS”(c)php.net
      • @vladkras 很难找到,但是,如您所知,mb_convert_encoding 函数执行双重过程:首先它解码字符串,然后使用新编码再次对其进行编码。 pass 常量在 PHP 的源代码中定义为 herembfl_no_encoding_pass,这意味着该函数将返回一个(Unicode?)字符串,根本没有编码。也许控制台中的稍后进程会再次对其进行编码?源图here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2016-12-02
      相关资源
      最近更新 更多