用自己的php函数浏览字符串,重音问题

thtygnil  于 2023-01-24  发布在  PHP
关注(0)|答案(2)|浏览(95)

我想使用我自己的函数来检查字符串的每个字符,我使用的是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]]?
谢谢

u4dcyp6a

u4dcyp6a1#

处理UTF-8时,应使用本机多字节字符串函数。例如,应将strlen替换为mb_strlen。重音字符是多字节UTF-8字符,strlen将看到所有4个字节,并在遇到重音字符时计算多个字符而不是一个字符。
mb_函数需要安装mbsatring PHP扩展。
正如您提到的重音字符,它们是多字节字符,strlen不支持多字节字符。
下面是一个友好的例子:

echo strlen('😀').PHP_EOL;
echo mb_strlen('😀');

产出:

4
1
cl25kdpy

cl25kdpy2#

$A = "tést";
$B = "tést";

if($A[1] == 'é' )
echo "true";
else
echo"false";

if($A[1] == $B[1])
echo "true";
else
echo"false";

在这两种情况下,我都期望是真的,但第一次是假的,第二次是真的。

**结论:如果我想比较一个可能带重音符号的字符,我不能把字符串当作数组使用。

我找到了一个类似于$chaineOut = strtr($chaineIn,$TabCarSimple)的解;
但我想确定我明白了问题所在。

相关问题