php iconv translit删除重音:不能作为例外工作?

dyn*_*mic 8 php string unicode utf-8 unicode-normalization

考虑这个简单的代码:

echo iconv('UTF-8', 'ASCII//TRANSLIT', 'è');
Run Code Online (Sandbox Code Playgroud)

它打印

 `e
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

 e
Run Code Online (Sandbox Code Playgroud)

你知道我做错了吗?


添加setlocale后没有任何改变

setlocale(LC_COLLATE, 'en_US.utf8');
echo iconv('UTF-8', 'ASCII//TRANSLIT', 'è');
Run Code Online (Sandbox Code Playgroud)

Hid*_*dde 9

我有这个标准函数来返回有效的url字符串而没有无效的url字符.在删除不需要的字符注释之后,魔法似乎就在行中.

这取自Symfony框架文档:http://www.symfony-project.org/jobeet/1_4/Doctrine/en/08,后者取自http://php.vrana.cz/vytvoreni-pratelskeho- url.php但我不会说捷克语;-)

function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('#[^\\pL\d]+#u', '-', $text);

  // trim
  $text = trim($text, '-');

  // transliterate
  if (function_exists('iconv'))
  {
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
  }

  // lowercase
  $text = strtolower($text);

  // remove unwanted characters
  $text = preg_replace('#[^-\w]+#', '', $text);

  if (empty($text))
  {
    return 'n-a';
  }

  return $text;
}

echo slugify('é'); // --> "e"
Run Code Online (Sandbox Code Playgroud)


ele*_*leg 7

cf @tchrist,带有INTL php扩展

http://fr2.php.net/manual/en/book.intl.php

preg_replace('/\pM*/u','',normalizer_normalize( $mystring, Normalizer::FORM_D));
Run Code Online (Sandbox Code Playgroud)

eéèêëiîïoöôuùûüaâäÅἭŐǟǠǺƶƈƉųŪŧȬƀ␢ĦȽŦƀǖƀǖ成为

eeeeeiiiooouuuuaaaAΗaaAƶƈƉuUŧOƀ␢ĦŁȽŦȽŦu


正如tchrist强调的那样,并非所有unicode字符都被认为是可分解的:

从Unicode图表中提取:

U0080.pdf

00CF我带有DIAERESIS的LATIN CAPITAL LETTER

≡0049I0308¨

注意,此符号"≡"表示可用的分解

00D0Ð拉丁文大写字母ETH

→00F0ð拉丁小写字母eth

→0110Đ拉丁语大写字母d中风

→0189Ɖ拉丁语大写字母非洲d

没有分解可用,恕我直言(我们可以认为ASCII字母D是可接受的等价物).

U0100.pdf

0110©带有中风的拉丁文大写字母D.

→00D0 - 拉丁语大写字母eth

→0111đ拉丁小写字母d中风

→0189Ɖ拉丁语大写字母非洲d

更奇怪的是:这个被认定为LATIN CAPITAL LETTER D(有中风),但不能这样分解!也许更酷的解决方案应该是获取每个char的unicode描述,并将其与每个ascii char的描述进行比较(并相应地替换).任何人?; - ]

cf http://unicode.org/Public/UNIDATA/UnicodeData.txt