如何使用PHP截断字符串中的非ascii字符

时间:2013-07-16 04:42:40

标签: php utf-8 preg-replace ascii non-ascii-characters

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

$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

任何帮助将不胜感激。

4 个答案:

答案 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);