Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php preg_replace:ascii字符串的unicode修饰符_Php_Regex_Unicode_Preg Replace_Ascii - Fatal编程技术网

php preg_replace:ascii字符串的unicode修饰符

php preg_replace:ascii字符串的unicode修饰符,php,regex,unicode,preg-replace,ascii,Php,Regex,Unicode,Preg Replace,Ascii,我需要使用正则表达式处理php脚本中的字符串。但是有一个问题-不同的字符串有不同的编码。如果字符串只包含ascii符号,mb\u detect\u encoding函数返回“ascii”。但如果字符串包含俄文符号,例如,mb\u detect\u encoding返回“UTF-8”。我认为手动检查每个字符串的编码不是个好主意。 所以问题是-对ascii字符串使用preg_replace(使用unicode修饰符)正确吗?写这样的代码是正确的吗用于ascii和utf-8字符串?是的,您可以始终使用

我需要使用正则表达式处理php脚本中的字符串。但是有一个问题-不同的字符串有不同的编码。如果字符串只包含ascii符号,
mb\u detect\u encoding
函数返回“ascii”。但如果字符串包含俄文符号,例如,
mb\u detect\u encoding
返回“UTF-8”。我认为手动检查每个字符串的编码不是个好主意。
所以问题是-对ascii字符串使用preg_replace(使用unicode修饰符)正确吗?写这样的代码是正确的吗用于ascii和utf-8字符串?

是的,您可以始终使用Unicode修饰符,它不会影响结果或性能。

如果两个选项是“utf-8”或“ascii”,则这不会有问题,但事实并非如此

如果PHP不使用UTF-8,它将使用ISO-8859-1,这不是ASCII(这是ASCII的超集,因为前127个字符。这是ASCII的超集。一些字符,例如瑞典的
å
ä
ö
,可以用ISO-8859-1和Unicode表示,具有不同的代码点!我认为这对pregå函数没有多大关系,因此它可能不适用于您的问题,但在使用不同编码时请记住这一点


您应该非常非常努力地了解字符串所在的字符集,而不必使用mb_detect_编码(mb_detect_编码不是保证,只是一个很好的猜测)。例如,通过HTTP获取的字符串确实在HTTP标头中指定了一个字符集。

7位ASCII字符集在UTF-8中编码相同。如果您有ASCII字符串,则应该能够在其上使用PREG“u”修饰符


但是,如果您有一个“补充”的8位ASCII字符集,如ISO-8859-1、Windows-1252或HP-Roman8,则最左边位设置为on(值x80-xff)的字符在UTF-8中的编码不相同,因此不适合使用PREG“u”修饰符。

Preg\u replace自动将所有ascii参数转换为unicode?ascii字符(代码点0-127)在UTF-8中是相同的,因此不需要转换。现在我取消了排序。我认为比较不是通过字符的代码点,而是通过ascii字符串的每个字节和UTF-8的每个2字节进行比较。>通过HTTP获取的字符串确实在HTTP头中指定了一个字符集。我发送
头。无论如何,如果我使用mb\u detect_编码对于$_POST变量,它返回“ascii”。这是否意味着猜测是错误的,字符串是utf-8编码的?不,如果它表示ascii,则很可能是ascii,这意味着所有字符的代码点都小于128(为了向后兼容,几乎所有编码都共享这些代码点)。这意味着ASCII检测应该完全正确,但其他编码可能不正确。但请注意,还有其他编码,PHP中的标准是ISO-8859-1(ASCII定义字符128-255的超集)如果不是UTF-8。如果没有指定编码,ISO-8859-1也是整个网络的标准。对不起,我还是不明白。发送上述标题
是否意味着我的服务器接收所有UTF-8编码的用户数据?1)如果是,为什么其中一些是ascii编码的?如果这是因为php尽可能地分配更少的内存,我猜字符串可以是ascii或utf-8编码的,没有别的。如果是这样,我没有更多的问题。2)如果不是,我如何“禁用”除unicode以外的所有编码?如果你在谈论表单帖子,是的,发布的表单应与网页的字符集相同(所有主要浏览器都会这样做)。1) UTF-8和ASCII在其127个第一个代码点中重叠,因此,例如,字母a-z和数字0-9在两种编码中具有完全相同的代码点。因此,mb_detect_编码无法区分这两个字符集,因为它们提供完全相同的二进制数据。综上所述,如果字符串都来自您自己的web表单,您可以指望它们与您的网页具有相同的字符集。