我想使用我自己的函数来检查字符串的每个字符,我使用的是UTF8,我不想使用str_replace或preg_match,但我想知道为什么它不起作用。
`
function GarderCaractereSimple($chaineIn)
{
//Garde seulement les lettres et les chiffres
//transforme les accents en caractères simple
$TabCarSimple = array('a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E','F'=>'F','G'=>'G','H'=>'H','I'=>'I','J'=>'J','K'=>'K','L'=>'L','M'=>'M','N'=>'N','O'=>'O','P'=>'P','Q'=>'Q','R'=>'R','S'=>'S','T'=>'T','U'=>'U','V'=>'V','W'=>'W','X'=>'X','Y'=>'Y','Z'=>'Z','0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','é'=>'e','è'=>'e','à'=>'a','ç'=>'c','ù'=>'u','ê'=>'e','ï'=>'i','ë'=>'e','ô'=>'o','ö'=>'o','_'=>'_','-'=>'-');
$length = strlen($chaineIn);
$chaineOut = "";
for($i=0; $i<$length; $i++)
{
//if(in_array($chaineIn[$i],$TabCarSimple)) //same problem
if(isset( $TabCarSimple[$chaineIn[$i]] ))
$chaineOut .= $chaineIn[$i];
}
return $chaineOut;
}
$test ="tést";
echo GarderCaractereSimple($test);
`
我想查找结果test,但结果为tst
我在我的服务器和一个虚拟的PHP引擎上试了试,我也有同样的问题。
如果$chaineIn[$i]与重音字符匹配,为什么我无法正确读取$TabCarSimple[$chaineIn [$i]]?
谢谢
2条答案
按热度按时间u4dcyp6a1#
处理UTF-8时,应使用本机多字节字符串函数。例如,应将
strlen
替换为mb_strlen
。重音字符是多字节UTF-8字符,strlen
将看到所有4个字节,并在遇到重音字符时计算多个字符而不是一个字符。mb_
函数需要安装mbsatring
PHP扩展。正如您提到的重音字符,它们是多字节字符,
strlen
不支持多字节字符。下面是一个友好的例子:
产出:
cl25kdpy2#
在这两种情况下,我都期望是真的,但第一次是假的,第二次是真的。
**结论:如果我想比较一个可能带重音符号的字符,我不能把字符串当作数组使用。
我找到了一个类似于$chaineOut = strtr($chaineIn,$TabCarSimple)的解;
但我想确定我明白了问题所在。