宣言使PHP脚本完全符合Unicode

tch*_*ist 10 php regex unicode utf-8

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

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

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

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

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

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

  • 所有字节功能(例如,strlen,strstr,strpos,和substr)的工作方式与相应的字符的功能(例如mb_strlen,mb_strstr,mb_strpos,和mb_substr).

  • 所有的正则表达式和regexy功能上的Unicode透明地工作(即,像所有的preggers都/u含蓄地上涨了,事情就是这样\w,并\b\s所有有关Unicode的工作方式Unicode标准要求他们的工作,等等).

额外信用:),我希望有一种方法可以将此声明"升级"为完全字形模式. 这样,字节或字符的功能变得字形功能(例如grapheme_strlen,grapheme_strstr,grapheme_strpos,和grapheme_substr),和正则表达式的东西工作在适当的字形(即.-甚至[^abc]-匹配一个Unicode字形集群无论多少码点含有,等等) .

Pas*_*TIN 6

这个完全unicode的东西正是PHP 6的想法- 已经在一年多前被取消了.

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


有一两件事,可能与你的第四点帮助,虽然是函数重载功能的的mbstring扩展名(引用):

mbstring支持"函数重载"功能,通过在标准字符串函数上重载多字节副本,您可以在不修改代码的情况下为这样的应用程序添加多字节感知.
例如,mb_substr()调用而不是substr()启用函数重载.


bob*_*nce 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代码单元语义,如果运气不好)