为什么这个str_ireplace()在非ASCII字符串上工作?

时间:2011-03-28 12:14:46

标签: php utf-8 character-encoding

注意:我认为我所知道的可能是错的,所以请妥善解决我的知识:)


I just answered a question about UTF-8 and PHP.

我建议使用str_ireplace('Волгоград', '', $a)

我没想到这会起作用,但确实如此。

我一直认为PHP将一个字节视为一个字符,因此当使用ASCII范围之外的字符时,为什么需要使用mb_*函数来获得准确的结果。

我认为俄语字符需要>每个1个字节。

我认为str_replace()可以正常工作,因为无论字节是否是多字节都可以匹配,只要它们是有序的。

我认为str_ireplace() 不起作用,因为PHP不知道如何将非ASCII字符映射到其等效的备用情况。但是,它 工作。


我错在哪里?给我尽可能多的信息:)

3 个答案:

答案 0 :(得分:6)

它的工作原理是将文本小写传递给依赖于语言环境设置的libc函数;适当的设置意味着如果正确的字符集用于字节,文本将正确地小写。

答案 1 :(得分:3)

另一种可能的解释。 Unicode平面具有与ISO-8859-1范围类似的属性。

将大写字母转换为小写只需要为ASCII范围添加0x20

0x41   A
0x61   a

而且 - 我没有费心去查找 - 我认为对于0xC0-0xDF中的Latin-1范围也是如此。这巧合也可能适用于Unicode范围内的俄语字母:

d092d09ed09bd093d09ed093d0a0d090d094   ВОЛГОГРАД
d0b2d0bed0bbd0b3d0bed0b3d180d0b0d0b4   волгоград

区别在于假设为L1字符的字节上添加了0x20。所以它可能只是一个区域设置。

答案 2 :(得分:0)

反之亦然:PHP不会将每个字符视为一个字节,但它将每个字节视为一个字符。因此,多个字符被视为多个字符(并且可能不是您期望的字符)。