Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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脚本完全Unicode友好的声明_Php_Regex_Unicode_Utf 8 - Fatal编程技术网

使PHP脚本完全Unicode友好的声明

使PHP脚本完全Unicode友好的声明,php,regex,unicode,utf-8,Php,Regex,Unicode,Utf 8,记住在PHP中做所有需要做的事情,以使其与Unicode正常工作,这太棘手、乏味且容易出错,因此我正在寻找让PHP神奇地将所有可能的东西从陈旧的ASCII字节模式升级到现代Unicode字符模式的诀窍,只需使用一个简单的声明即可一次性完成所有操作 我们的想法是使PHP脚本现代化,以便与Unicode一起工作,而不必用一堆混乱的替代函数调用和特殊正则表达式来混乱源代码。一切都应该使用Unicode“做正确的事”,不要问任何问题 考虑到目标是以最小的麻烦实现最大的一致性,这个声明必须至少做到以下几点

记住在PHP中做所有需要做的事情,以使其与Unicode正常工作,这太棘手、乏味且容易出错,因此我正在寻找让PHP神奇地将所有可能的东西从陈旧的ASCII字节模式升级到现代Unicode字符模式的诀窍,只需使用一个简单的声明即可一次性完成所有操作

我们的想法是使PHP脚本现代化,以便与Unicode一起工作,而不必用一堆混乱的替代函数调用和特殊正则表达式来混乱源代码。一切都应该使用Unicode“做正确的事”,不要问任何问题

考虑到目标是以最小的麻烦实现最大的一致性,这个声明必须至少做到以下几点(加上我忘记了的任何有助于实现总体目标的东西):

  • PHP脚本源代码本身被认为是UTF-8格式(例如字符串和正则表达式)

  • 所有输入和输出根据需要自动转换为UTF‑8或从UTF‑8转换为UTF‑8,并带有标准化选项(例如,所有输入标准化为NFD,所有输出标准化为NFC)

  • 所有Unicode版本的函数都使用这些函数(例如,
    Collator::sort
    用于
    sort

  • 所有字节函数(例如,
    strlen
    strstrstr
    strpos
    ,和
    substr
    )的工作方式与相应的字符函数(例如,
    mb_strlen
    mb_strpos
    ,和
    mb_substr
    )类似

  • 所有正则表达式和正则表达式函数都透明地在Unicode上工作(例如,像所有pregger都隐式地加上了
    /u
    ,像
    \w
    \b
    \s
    这样的函数都在Unicode上工作,等等)


对于额外的学分:),我希望有一种方法可以“升级”这个声明到完整的grapheme模式。这样,字节或字符函数就变成了grapheme函数(例如,
grapheme\u strlen
grapheme\u strstr
grapheme\u strpos
,和
grapheme\u substr
),而正则表达式的内容在正确的grapheme上工作(即,
-甚至
[^abc]
-匹配Unicode grapheme群集,无论它包含多少代码点,等等)。

完整的Unicode正是一年多前取消的PHP 6的想法

所以,不,除了使用正确的函数,记住字符和字节不一样之外,没有办法得到所有这些


不过,第四点可能会对您有所帮助的一点是
mbstring
扩展名(quoting)的用法:

mbstring支持一个“函数” “重载”功能,使您 将多字节感知添加到这样一个 无需修改代码的应用程序 通过重载多字节副本 关于标准字符串函数。
例如,
mb_substr()
是 调用而不是
substr()
if 已启用函数重载

所有字节函数(例如strlen、strstrtr、strpos和substr)的工作方式与相应的字符函数(例如mb_strlen、mb_strstrtr、mb_strpos和mb_substr)类似

这不是个好主意

Unicode字符串不能透明地替换字节字符串。即使您正确地将所有人类可读文本作为Unicode处理,字节字符串在处理非基于字符的文件和网络数据以及与显式使用字节的系统交互时仍有重要用途

例如,吐出一个标题
“Content-Length:”.strlen($imageblob)
,如果突然使用了代码点语义,那么您将变得断断续续

您仍然需要同时拥有
mb_strlen
strlen
,并且您必须知道在每种情况下使用哪个是正确的;没有一个开关可以让你自动做正确的事情

这就是为什么在IMO中,使用可以用字节或代码点语义处理的单个字符串数据类型的方法通常是错误的。为字节字符串(具有字节语义)和字符串(具有Unicode代码点语义(*))提供单独数据类型的语言往往更加一致


(*:或UTF-16代码单元语义,如果不走运)

真的吗?取消了吗?既然现在几乎整个网络都是Unicode,为什么会有人想取消这么重要的东西呢(如果还没有一种方法(我原以为已经有了),那么我也会接受一个答案,说明如何编写这样一个东西。它已经有了(即使我不确定“取消”是否是正确的词,这是基本的想法);请看;;;如何编写像“全部使用unicode”这样的东西)?好吧,这就是PHP6的想法——而且做了很多工作……如果存在
mbstring.func\u重载
,在我看来,应该有一种方法让它也适用于其他函数,包括
grapheme.*
函数。同样,不推荐使用的
mb\u regex\u set\u选项
似乎正是需要的-save t为什么它没有包含
/u
用于
preg.*
。为什么要做这么多工作?问题是PHP的模块/扩展机制不够丰富,无法使这些扩展自然且易于编写?你不能在某个表中添加一些东西吗,尤其是在第一种情况下?谢谢你,Pascal。我想你可以使用一些mec我喜欢mbstring使用重载来重新定义所有PHP函数;但我让您想象一下,用C重新编写所有这些函数需要多少时间;-)(这是PHP6开发的一部分,顺便说一句,检查所有PHP函数,以确保它们能与unicode一起工作)Perl似乎在所有方面都能满足
length
。您只需从内部逻辑字符编码即可