2012-04-02 101 views
1

我需要使用正则表达式在我的php脚本中处理字符串。但是有一个问题 - 不同的字符串有不同的编码。如果字符串只包含ascii符号,mb_detect_encoding函数返回'ASCII'。但是,如果字符串包含俄语符号,例如,mb_detect_encoding返回'UTF-8'。我想,手动检查每个字符串的编码并不是个好主意。 所以问题是 - 对于ascii字符串使用preg_replace(使用unicode修饰符)是否正确?为ascii和utf-8字符串编写这样的代码preg_replace ("/[^_a-z]/u","",$string);是否正确?php preg_replace:用于ASCII字符串的unicode修饰符

回答

2

如果两个选项是“UTF-8”或“ASCII”,这将是没有问题的,但事实并非如此。

如果PHP不使用UTF-8,它使用ISO-8859-1,它不是ASCII(它是ASCII的超集,前127个字符,它是ASCII的超集,例如一些字符瑞典的å,äö,可以用ISO-8859-1和Unicode代表,用不同的代码点表示!我认为这对于preg_ *函数来说不太重要,所以它可能不适用于你的问题,但在使用不同的编码时请记住这一点

你应该真的试着知道你的字符串在哪个字符集中,没有mb_detect_encoding的魔力(mb_detect_encoding不是保证,只是一个很好的猜测)。例如,通过HTTP doe获取的字符串s在HTTP标头中指定了一个字符集。

+0

>通过HTTP获取的字符串确实在HTTP标头中指定了一个字符集。 我发送'无论如何,如果我为$ _POST变量使用mb_detect_encoding,它将返回'ascii'。这是否意味着猜测是错误的,字符串是utf-8编码? – user1235446 2012-04-02 14:59:38

+0

不,如果它表示ASCII,它很可能是ASCII,这意味着所有字符的代码点都小于128(几乎每个编码都共享这些代码点以实现向后兼容)。这意味着ASCII检测应该完全正确,但其他编码可能不会。但请注意,还有其他编码,并且如果不是UTF-8,则PHP中的标准是ISO-8859-1(ASCII定义字符128-255的超集)。如果没有指定编码,ISO-8859-1也是网络上的标准。 – 2012-04-02 15:02:13

+0

对不起,我还是不明白。发送上面提到的头文件是否意味着我的服务器接收到所有用户数据编码的utf-8? user1235446 2012-04-02 15:15:48

0

是的,你总是可以使用Unicode修饰符,它不会影响结果和性能。

+0

Preg_replace会自动将所有ascii参数转换为unicode? – user1235446 2012-04-02 14:46:28

+0

UTF-8中的ASCII字符(代码点0-127)是相同的,因此不需要转换。 – 2012-04-03 07:17:04

+0

现在我不喜欢。我认为比较不是通过字符的代码点,而是通过ascii字符串中的每个字节以及utf-8中的每个2个字节进行比较。 – user1235446 2012-04-03 08:36:19

0

7位ASCII字符集在UTF-8中编码相同。如果你有一个ASCII字符串,你应该可以在其上使用PREG“u”修饰符。但是,如果您有“补充”的8位ASCII字符集(如ISO-8859-1,Windows-1252或HP-Roman8),则最左侧位(值x80-xff)的字符不是在UTF-8中编码相同,使用PREG“u”修饰符也不合适。