宣言使PHP脚本完全符合Unicode

时间:2011-04-23 15:33:14

标签: php regex unicode utf-8

记住要在PHP中完成所有你需要做的事情才能让它与Unicode一起正常工作是非常棘手,乏味和容易出错的,所以我正在寻找让PHP神奇地升级的技巧它可以从发霉的旧ASCII字节模式进入现代Unicode字符模式,一次性完成并只使用一个简单的声明。

我们的想法是使PHP脚本现代化以使用Unicode,而不必使用一堆混乱的备用函数调用和特殊的正则表达式来混淆源代码。一切都应该只用“做正确的事”用Unicode,没有问题。

鉴于目标是最大的Unicode,而且最小化,这个声明必须至少做这些事情(加上我忘记的任何其他事情,以进一步推进总体目标) :

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

  • 所有输入和输出都会根据需要自动转换为UTF-8,并使用标准化选项(例如,所有输入归一化为NFD,所有输出归一化为NFC)。

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

  • 所有字节函数(例如strlenstrstrstrpossubstr)都像对应的字符函数一样工作(例如{{1} },mb_strlenmb_strstrmb_strpos)。

  • 所有正则表达式和regexy函数都透明地用于Unicode(即,像所有preggers隐含mb_substr一样,/u\w和{{1所有工作都在Unicode the way The Unicode Standard requires them to work等)。

为了额外的功劳:),我希望有一种方法可以将此声明“升级”为完全字形模式。这样字节或字符函数就成为字形函数(例如{ {1}},\b\sgrapheme_strlen),正则表达式的内容适用于正确的字形(即grapheme_strstr - 甚至grapheme_strpos - 匹配Unicode字形集群,无论它包含多少代码点等等。

2 个答案:

答案 0 :(得分:6)

那个完全unicode 正是 PHP 6 的想法 - 一年多以来一直取消

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


但是,第四点可能有一点可以帮助你mbstring扩展(引用)Function Overloading Feature

  

mbstring支持'功能   重载'功能,使您   添加多字节意识到这样的   应用程序无需修改代码   通过重载多字节对应物   关于标准字符串函数。   
例如,mb_substr()是   调用而不是substr() if   功能重载已启用。

答案 1 :(得分:5)

  

所有字节函数(例如,strlen,strstr,strpos和substr)都像对应的字符函数一样工作(例如,mb_strlen,mb_strstr,mb_strpos和mb_substr)。

这不是一个好主意。

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

例如,吐出标题'Content-Length: '.strlen($imageblob),如果突然使用代码点语义,你就会破碎。

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

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

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