【问题标题】:How to truncate non-ascii characters from string using PHP如何使用 PHP 从字符串中截断非 ascii 字符
【发布时间】:2013-07-16 04:42:40
【问题描述】:

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

$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)吗?
  • 是的。但没有运气。我尝试了 PHP 函数的所有字符转换,最后决定替换 unicode 字符,只替换为特定字符,如 _
  • 哦,我误会了,你想把它转换成 ascii
  • @steven,没问题 :)

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


【解决方案1】:

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

我猜你想要这样的东西:

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

iconv-call 的结果是:recyclage pletre francin.jpg

【讨论】:

  • 我遇到了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
  • 嗯显然"not all characters are decomposable"。这意味着某些字符被翻译成非 ASCII 字符。这意味着您可以使用正则表达式来过滤或映射任何不需要的字符(当然“映射”可能是一项更大/复杂的任务)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    Check this code 
    
    <?php
    
    $string = 'recyclage plétre francin.jpg';
    $str = preg_replace('/[^\x20-\x7E]/', '', $string);
    echo $str;
    ?>
    

    【讨论】:

    • 非常适合我
    【解决方案4】:

    您可以使用简单的字符来删除除 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多