我有一个以下字符串作为文件名
$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
问题请f
字符显示recyclage pl
之类的输出,并且已截断.JPG
。实际上文件名是recyclage plâtre francin
,当我调试时它显示recyclage plƒtre francin.JPG
并且在此之后写入休息。有什么想法吗?
当我尝试转换tri et recyclage du plâtre
时,但在阅读时显示tri et recyclage du plâtre
,转换后显示tri et recyclage du pl^atre
。
任何帮助将不胜感激。
答案 0 :(得分:6)
如果使用TRANSLIT
修饰符,则会替换目标编码中无法显示的所有字符。由于é可以在ISO-8859-1中表示,因此它被编码为ANSI代码0xE9
。
我想你想要这样的东西:
$string = 'recyclage plétre francin.jpg';
echo iconv("UTF-8","ASCII//TRANSLIT",$string);
iconv
- 调用的结果是:recyclage pletre francin.jpg
答案 1 :(得分:2)
这是我的问题的解决方案。最后,我能够看到转换。某些Unicode字符将替换为某些Ascii字符。但毕竟现在一切正常。
function toASCII($str)
{
$accent = 'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕƒ';
$noaccent = 'SOZsozYYuaaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRra';
$string = strtr(utf8_decode($string),utf8_decode($accent),$noaccent);
return strtr($string, $accent, $noaccent);
}
答案 2 :(得分:1)
Check this code
<?php
$string = 'recyclage plétre francin.jpg';
$str = preg_replace('/[^\x20-\x7E]/', '', $string);
echo $str;
?>
答案 3 :(得分:0)
您可以使用简单的删除除a-z,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);