PHP file_get_content在Windows上工作但不是unix

时间:2017-04-19 15:00:09

标签: php utf-8 ascii file-get-contents

当我在本地工作时,这项工作:

$file_path = utf8_decode($path); // path == folder/éèà.xml
if (file_exists($file_path)) {
            return file_get_contents($file_path);

我服务器上的相同代码无法正常工作,因为找不到该文件。但是,如果我在同一目录中使用路径作为“folder / 1111.xml”,则在本地和服务器上运行。

我的目标是处理正确的“奇怪”文件名,并且这样做我想用ASCII编码它们,或者任何可以工作的东西。

当我记录编码mb_detect_encoding时,我使用Windows ASCII获取$ path AND $ file_path,但是在我的服务器上它是UTF-8,然后是UTF-8。

我尝试了多种编码“库”,例如SebastiánGrignoli Nicolas Grekas

  //Sebastián Grignoli
  protected static function utf8_decode($text, $option)
  {
    if ($option == self::WITHOUT_ICONV || !function_exists('iconv')) {
       $o = utf8_decode(
         str_replace(array_keys(self::$utf8ToWin1252), array_values(self::$utf8ToWin1252), self::toUTF8($text))
       );
    } else {
       $o = iconv("UTF-8", "Windows-1252" . ($option == self::ICONV_TRANSLIT ? '//TRANSLIT' : ($option == self::ICONV_IGNORE ? '//IGNORE' : '')), $text);
    }
    return $o;
  }

OR

// Nicolas Grekas
// Generic UTF-8 to ASCII transliteration
public static function toAscii($s, $subst_chr = '?')
{
    if (preg_match("/[\x80-\xFF]/", $s)) {
        static $translitExtra = array();
        $translitExtra or $translitExtra = static::getData('translit_extra');
        $s = n::normalize($s, n::NFKC);
        $glibc = 'glibc' === ICONV_IMPL;
        preg_match_all('/./u', $s, $s);
        foreach ($s[0] as &$c) {
            if (!isset($c[1])) {
                continue;
            }
            if ($glibc) {
                $t = iconv('UTF-8', 'ASCII//TRANSLIT', $c);
            } else {
                $t = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $c);
                if (!isset($t[0])) {
                    $t = '?';
                } elseif (isset($t[1])) {
                    $t = ltrim($t, '\'`"^~');
                }
            }
            if ('?' === $t) {
                if (isset($translitExtra[$c])) {
                    $t = $translitExtra[$c];
                } else {
                    $t = n::normalize($c, n::NFD);
                    if ($t[0] < "\x80") {
                        $t = $t[0];
                    } else {
                        $t = $subst_chr;
                    }
                }
            }
            $c = $t;
        }
        $s = implode('', $s[0]);
    }
    return $s;
}

那些作为mb_detect_encoding工作的人都没有记录相同的值,并且路径仍然不在服务器端。

我如何处理任何一种路径?

0 个答案:

没有答案