【问题标题】:Convert files encoding转换文件编码
【发布时间】:2014-05-20 06:04:28
【问题描述】:

我有一个 PHP 应用程序,它的文件编码是希腊 ISO (iso-8859-7)。我想将文件转换为 utf-8,但仅使用 utf-8 保存文件是不够的,因为希腊文本会出现乱码。有没有一种“自动”的方法来做到这一点,这样我就可以完全转换我的应用程序的编码,而不必遍历每个文件并重写文本?

【问题讨论】:

    标签: php encoding utf-8 character-encoding file-encodings


    【解决方案1】:

    在 Linux 系统上,如果您确定所有文件当前都以 ISO-8859-7 编码,您可以这样做:

    bash> find /your/path -name "*.php" -type f \
        -exec iconv "{}" -f ISO88597 -t UTF8 -o "{}.tmp" \; \
        -exec mv "{}.tmp" "{}" \;
    

    这将转换位于/your/path 以及所有子目录中的所有 PHP 脚本文件。删除-name "*.php" 即可转换所有文件。


    由于您在 Windows 下,最简单的选择是这样的 PHP 脚本:

    <?php
    $path = realpath('C:\\your\\path');
    
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path), 
        RecursiveIteratorIterator::SELF_FIRST
    );
    
    foreach($iterator as $fileName => $file){
        if($file->isFile())
            file_put_contents(
                $fileName,
                iconv('ISO-8859-7', 'UTF-8', file_get_contents($fileName))
            );
    }
    

    【讨论】:

    • 不幸的是,我使用的是 Windows 系统。我可以为此使用 Cygwin 吗?
    • 是的,你可以。但是上面的 PHP sn-p 应该可以完成这项工作吗?
    【解决方案2】:

    试试iconv函数

    $new_string = iconv("ISO-8859-7", "UTF-8", $old_string);
    

    【讨论】:

    • 这只会转换内容,我想完全转换文件,包括内容。
    • 啊,我读了你的最后一句话,关于如何自动转换数据而无需手动重新输入。您将不得不编写自己的函数来遍历您的应用程序并更新文件的编码。如果 iconv 不适合您,请尝试 mb_convert_encoding (php.net/manual/en/function.mb-convert-encoding.php)。另外,当您说文本出现乱码时,是在文本编辑器中查看文件时?还是在 PHP 中输​​出文件内容时?
    • 不用担心。第二个。
    • 您是否在输出中发送了 UTF8 内容类型标头?以及在html中设置内容类型为utf8?
    • 是的。问题在于原始应用编码是 iso-8859-7,不仅来自数据库的数据,还有文件。
    【解决方案3】:
    <?php
    function writeUTF8File($filename,$content) { 
            $f=fopen($filename,"w"); 
            # Now UTF-8 - Add byte order mark 
            fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
            fwrite($f,$content); 
            fclose($f); 
    }
    
    ?>
    

    【讨论】:

      【解决方案4】:

      以下代码应该适合你,它是一个 PowerShell 脚本,你可以Start &gt; Run &gt; powershell 并在修改所需行后粘贴代码。

      $sourcepath = "d:\temp\old\"
      $targetpath = "d:\temp\new\"
      foreach ($file in Get-ChildItem $sourcepath -Filter *.php -Recurse) {
        $content = [System.IO.File]::ReadAllBytes($sourcepath + $file)
        $str = [System.Text.Encoding]::GetEncoding("ISO-8859-7").GetString($content)
        # $str = $str.Replace("ISO-8859-7", "UTF-8")
        [System.IO.File]::WriteAllText($targetpath + $file, $str)
      }
      

      您可以删除第 6 行的 # char 以在保存前进行一些替换。

      【讨论】:

        猜你喜欢
        • 2021-01-21
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2013-01-28
        • 2021-07-07
        • 1970-01-01
        • 2014-02-17
        相关资源
        最近更新 更多