今天我遇到了PHP函数strpos()的一个问题,因为它返回FALSE,即使正确的结果显然为0.这是因为一个参数是用UTF-8编码的,但另一个参数(原点是HTTP GET参数)显然不.
我现在的问题是:明智地使用PHP多字节字符串函数来避免将来出现这些问题吗?我应该避免使用传统的strpos,strlen,ereg等功能吗?
注意:我不想在PHP.ini中设置mbstring.func_overload全局,因为这会在使用PEAR库时导致其他问题.我使用的是PHP4.
这取决于您使用的字符编码.在单字节字符编码或UTF-8(字符内的单个字节永远不会被误认为是另一个字符)中,只要您搜索的字符串和您用于搜索的字符串相同编码然后你可以继续使用常规字符串搜索功能.
如果您使用UTF-8以外的多字节编码,这不会阻止字符中的单个字节像其他字符一样出现,那么使用常规字符串搜索功能进行字符串搜索绝对不安全.你可能会发现误报.这是因为PHP在strpos等函数中的字符串比较是按字节进行的,除了专门为防止出现此问题而设计的UTF-8外,多字节编码还存在以下问题:字符中的任何后续字节都由多个字节可以匹配不同字符的一部分.
如果您正在搜索的字符串和您要搜索的字符串具有不同的字符编码,则始终需要进行转换.否则,您会发现对于在其他编码中表示不同的任何字符串,它将始终返回false.您应该对输入进行此类转换:决定应用程序将使用的字符编码,并在应用程序中保持一致.只要您以不同的编码接收输入,就可以进行转换.