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)
我有这个标准函数来返回有效的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)
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