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

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,请注意显示输出的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
任何帮助将不胜感激。

你尝试过使用 utf8_encode($string) 吗? - steven
是的,但没有运气。我尝试了所有PHP函数的字符转换,最终决定替换Unicode字符,并用特定字符(如“_”)进行替换。 - Smile
哦,我误解了,你想将它转换为ASCII。 - steven
尝试访问 https://dev59.com/cWw15IYBdhLWcg3wntEQ 以检测字符串中的非 ASCII 字符。 - Rakesh Sharma
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

我遇到了一个问题,文件名为recyclage plâtre francin,但是在调试时显示为recyclage plƒtre francin.JPG,并且输出结果中的f字符截断了.JPG。你有什么想法吗? - Smile
当我试图转换tri et recyclage du plâtre时,但在读取时显示为tri et recyclage du plâtre,转换后显示为tri et recyclage du pl^atre - Smile
嗯,显然"not all characters are decomposable"。这意味着一些字符会被转换为非ASCII字符。这就意味着你可以使用一个正则表达式过滤或映射任何不需要的字符(当然,“映射”可能是一个更大/复杂的任务)。 - vstm

3

这是对我的问题的解决方案。最终我能够看到转换结果。一些Unicode字符被替换为Ascii字符。但总体来说,一切现在都正常工作。

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

1
Check this code 

<?php

$string = 'recyclage plétre francin.jpg';
$str = preg_replace('/[^\x20-\x7E]/', '', $string);
echo $str;
?>

对我来说完美地工作了。 - Ronen Morecki

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接