当我在本地工作时,这项工作:
$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工作的人都没有记录相同的值,并且路径仍然不在服务器端。
我如何处理任何一种路径?