注意:我认为我所知道的可能是错的,所以请妥善解决我的知识:)
I just answered a question about UTF-8 and PHP.
我建议使用str_ireplace('Волгоград', '', $a)
。
我没想到这会起作用,但确实如此。
我一直认为PHP将一个字节视为一个字符,因此当使用ASCII范围之外的字符时,为什么需要使用mb_*
函数来获得准确的结果。
我认为俄语字符需要>每个1个字节。
我认为str_replace()
可以正常工作,因为无论字节是否是多字节都可以匹配,只要它们是有序的。
我认为str_ireplace()
不不起作用,因为PHP不知道如何将非ASCII字符映射到其等效的备用情况。但是,它 工作。
我错在哪里?给我尽可能多的信息:)
答案 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不会将每个字符视为一个字节,但它将每个字节视为一个字符。因此,多个字符被视为多个字符(并且可能不是您期望的字符)。