今天我跑与php函数strpos()一个问题,因为它返回FALSE即使正确的结果明显0。这是因为一个参数是在UTF-8编码的,但其他(原点是HTTP GET参数)显然不是

现在我已经注意到,使用mb_strpos功能解决我的问题。

我的问题是现在:是否明智地使用PHP多字节字符串函数通常以避免在未来的论文有问题?我应该避免传统strposstrlenereg,等等等等在所有功能?

注意:我不想设置在php.ini mbstring.func_overload全球性的,因为这种使用PEAR库时会导致其他问题。我使用PHP4。

有帮助吗?

解决方案

这取决于要使用的字符编码。在单字节字符编码或UTF-8(其中一个字符中的一个字节不能被误认为是另一个字符),那么只要您正在搜索的字符串,您使用搜索的字符串是在同一编码然后就可以继续使用常规的字符串搜索功能。

如果您使用的是UTF-8,这并不妨碍一个字符内单个字节出现像其他字符以外的多字节编码,那么这是从来没有确保安全的使用常规的字符串搜索功能的搜索字符串。您可能会发现误报。这是因为,在功能,如strpos PHP的字符串比较是每个字节,并使用UTF-8,它是专为防止这个问题之外,多字节编码苦,在一个字符的任何后续字节组成的问题多于一个字节可以匹配不同的字符的一部分。

如果字符串中,你正在寻找的的和你正在寻找不同的字符编码的字符串,然后转换将永远是必要的。否则,你会发现,对于将在其他的编码有不同表示任何字符串,它总是返回false。你应该做这样的转换输入:决定你的编码应用程序将使用一个字符,并在应用程序中是一致的。你在不同的编码接收输入的任何时间,对转换的方式。

其他提示

有出现了一些问题,在PHP版本MB_ *函数之前5.2。所以,如果你的代码是在不同版本的PHP的多个平台去,可能会出现奇怪的行为。此外,MB_ strpos功能是相当缓慢的,它跳过由offset参数指定让内部使用的实际字节位置的字符数。在根据对strpos / mb_strpos功能环路这可以成为一个主要瓶颈。

如果您使用相同的编码无处不在,一般是没有问题的。我用UTF-8我的所有页面,而实际上从未遇到过这个问题。到底真的可以归结为指定相同的编码的网页和数据库。

例如:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

在大多数情况下,这意味着所有的数据源的应用程序将在相同的编码传送数据,因此你会避免这种问题。

这都将与到来PHP 6好得多,顺便说一句,因为它将包括完整的Unicode - 载体。

您不必使用mb_strpos,但你必须确保你的应用程序中的所有数据都是相同的:无论是一个mb_string,或者在一个特定的编码纯字符串。 (一般UTF-8)

如果你确保你的网页是UTF-8,你的表单提交被解释为UTF-8,你的数据库存储UTF-8,你通常会确定。索引字符串操作(特别是截短)可以打破一个UTF-8序列,这是烦人的,但是通常不是灾难性的。如果你确实需要的支持,水平,mb_strings是你唯一的选择(当然,你必须确保你的应用程序和库和PHP版本的所有部件都可以用他们正确对待和处理)。

开发在PHP正确处理Unicode的网站是不是太好玩了现在:比较像Python和.NET语言的Unicode的支持非常差。希望PHP6会提高的问题。

我建议使用以下PHP UTF-8库:

http://sourceforge.net/projects/phputf8

与应用程序捆绑它通过不需要mbstring扩展松开你的应用程序的需求,但你仍然可以得到UTF-8字符串函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top