3

我有一个以下字符串作为文件名

$string = 'recyclage plétre francin.jpg';

并尝试使用以下代码

echo preg_replace('/[^a-z0-9|^.]/i', '_', iconv("UTF-8","ISO-8859-1//TRANSLIT",$string));

由于文件名中有一个特殊的(非 ascii)字符,因此在使用 PHP 上传文件时会创建垃圾字符。

我想要的是用特定的 Ascii 字符替换任何 unicode(非 ascii)字符。我想保留所有受支持的 Ascii 字符并删除非 ascii 字符。由于文件名中的目录分隔符将给出根路径,我也想保留/或斜杠。\

编辑:(以下未解决)

我对显示输出recyclage plƒtre francin.JPG的字符有疑问,它已被截断。实际上文件名是,当我调试它时它已经显示出来,其余的就是在那之后写的。任何的想法?frecyclage pl.JPGrecyclage plâtre francinrecyclage plƒtre francin.JPG

当我试图转换tri et recyclage du plâtre但在阅读时它显示tri et recyclage du plâtre和转换后它显示tri et recyclage du pl^atre

任何帮助将不胜感激。

4

4 回答 4

6

如果使用TRANSLIT修饰符,它将替换所有无法在目标编码中显示的字符。由于 é 可以用 ISO-8859-1 表示,因此它被编码为 ANSI-Code 0xE9

我猜你想要这样的东西:

$string = 'recyclage plétre francin.jpg';
echo iconv("UTF-8","ASCII//TRANSLIT",$string);

该调用的结果iconv是:recyclage pletre francin.jpg

于 2013-07-16T04:54:37.170 回答
3

这是我的问题的解决方案。最后我可以看到转换。一些 Unicode 字符被一些 Ascii 字符替换。但毕竟现在一切正常。

function toASCII($str)
{
    $accent   = 'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕƒ';
    $noaccent = 'SOZsozYYuaaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRra';
    $string = strtr(utf8_decode($string),utf8_decode($accent),$noaccent);
    return strtr($string, $accent, $noaccent);
}
于 2013-07-16T09:41:03.860 回答
1
Check this code 

<?php

$string = 'recyclage plétre francin.jpg';
$str = preg_replace('/[^\x20-\x7E]/', '', $string);
echo $str;
?>
于 2013-07-16T04:47:29.950 回答
0

您可以使用简单的删除除 az、0-9 或空格以外的所有字符。

// Remove all characters that are not the separator, a-z, 0-9, or whitespace
$string = preg_replace('![^'.preg_quote('-').'a-z0-_9\s]+!', '', strtolower($string));
// Replace all separator characters and whitespace by a single separator
$string = preg_replace('!['.preg_quote('-').'\s]+!u', '-', $string);
于 2015-03-13T08:01:47.140 回答