为什么PHP完全不能完全支持Unicode?


18

众所周知,PHP在Unicode方面存在问题。由于Unicode实现的困难,版本6被有效地放弃了。但是我想知道是否有人知道确切的原因吗?体系结构/设计问题,性能问题,社区问题(我敢打赌),还有其他问题吗?

Answers:


16

PHP作为一种语言肯定可以拥有它,但是我认为问题在于与现有程序的兼容性。Unicode支持可以通过细微的方式破坏它们,这是最令人讨厌的错误。

当前,PHP中大多数字符串处理功能都是“二进制安全的”,这意味着您可以使用它们来以任何编码以及图像数据等二进制格式来处理任何文件。

添加Unicode字符串后,您必须非常小心,不要将Unicode字符串与二进制字符串混合使用(当您的字符串来自不同的来源并且您之前不必担心它时,会非常困难)。而且您再也不会对编码一无所知了(很多脚本对此一无所知!)

另一个困难但可解决的问题是Unicode字符串中的随机访问。$string[$offset]从微不足道的变化到非常缓慢的变化或几乎缓慢的变化以及非常复杂的变化的实现。

同样,我认为选择UTF-16作为PHP的内部编码是错误的。它具有与UTF-8相同的问题(由于代理对而导致宽度可变)和UCS-2效率低下的问题。也许他们应该废弃它,然后从UTF-8重新开始?

</speculation>


2
完全同意切换到utf8。
GrandmasterB 2010年

您认为除了数据块大小以外,UTF-16比UTF-8差吗?
ts01 2010年

3
@Dean Harding:我并不是说根本不可能使用UTF-16,只有随机访问(在O(1)中)是不可能的。UTF-16不能保证第100个代码点将从第200个字节开始,因此要访问第100个代码点,您必须线性扫描所有先前的代码点(好的实现当然会缓存结果)。在这方面,它类似于UTF-8(即,对第n个字符/代码点的访问是O(n),而不是O(1))。
Kornel

1
@Dean:比如像UTF-16和UTF-8之间的核对或转换肯定也不会因为他们的结合字符做的工作同为代理人。
dan04'3

3
有关在UTF-16(或任何其他编码)上选择UTF-8的原因的出色总结可以在utf8everywhere.org上找到。
Joachim Sauer

11

TLDR:许多PHP库只是不支持unicode或以彼此不兼容的方式支持unicode的本机C库的薄薄一层。纠正这种情况很可能会导致向后不兼容的更改。

免责声明:几年前,我从PHP切换到Python(从不回头),我的观点显然带有偏见。

我认为PHP是一个不错的技巧。作为一种hack,它开始自命不凡,并从一堆稀疏的库中混乱地发展起来,因为它们缺乏良好的思想和统一的设计(从计算机语言理论的角度)。

正如马基雅维利(Machiavelli)所说,“未先奠定基础的人也许能够在事后奠定基础,但会给建筑师带来麻烦,并给建筑物造成危险”。

对于编程语言,它越受欢迎,就越难更改。这就是为什么像C这样的语言每10年更改一次的原因。例如,Python 3进行了许多向后不兼容的更改,这并不漂亮。以前的Python版本中对unicode的支持已经被认为优于PHP当前的状态,但是请猜测:Python 3中最具争议性的变化与unicode处理有关。来自Armin Ronacher的咆哮总结了Python社区的巨大挫败感。

PHP是“无处不在”的Web平台,使其成为自己成功的受害者。在PHP中为unicode统一支持是不可避免的,但是这需要大量的血液,汗水和眼泪。


好吧,我想每个人都同意。但是我在问细节;)
ts01 2010年

3
问题是许多基础库不能很好地处理unicode,并且很难从头开始解决问题。
Paulo Scardine 2010年

(仅供参考,“从几年前开始”,PHP变得更好,Python变得更糟)
ZJR

1
@ZJE:很高兴知道,谢谢。您是否愿意为我提供一些有关此更改的参考资料?
Paulo Scardine

6

停止旧的PHP 6工作的主要原因之一是它带来的内部复杂性和要做的工作量,几乎没有人完全理解。

一段历史:PHP 6的Unicode实现是由一个更大的PHP用户的需求设计的,并试图做到“正确”的Unicode。经过一番评估后,PHP要成为Unicode支持的主要设计者选择添加一个内部为Utf-16的新字符串类型,并允许在不同位置使用不同的编码。因此,代码可能用一种编码编写,输出可能使用不同的编码,而“ runtme操作”则使用其他一些编码。选择UTF-16的原因是,该工作应基于使用UTF-16的ICU库,并且发现这种编码可以快速进行通用的字符串操作,而utf-和utf-16之间的转换相对便宜。到目前为止,一切都很好。

现在,这样做的结果是最重要的是引入了新的字符串类型。到目前为止,PHP的内部类型系统具有几种类型(NULL,bool,int / long,float / double,字符串,数组,资源,对象),并且很多代码对此都作了一些假设。除了这些假设之外,所有操作字符串的函数(还有很多)都必须单独评估,并且必须确定如何处理编码。它们应该在二进制字符串还是unicode字符串上工作?如果需要转换,则应使用哪种编码等,这需要大量的工作,并且在某些情况下,做起来很复杂。此外,内部API变得相当复杂,因为PHP中的大多数关键API都有二进制字符串的版本(旧版本),然后通常是“运行时编码”字符串的版本,

在这样做的过程中,许多开发人员迷失了复杂性,被utf-16烦恼,并且不喜欢这样的事实,即这将使内存使用量增加一倍以上,并花费大量时间转换字符串,同时破坏大多数现有应用程序。因此,PHP是由志愿者驱动的,越来越少的开发人员正在使用它,其他事情堆积如山,贡献者对此感到不满,最终不得不放弃它。

现在,未来会带来什么?-发生了缓慢的发展,围绕utf-8构建的PHPae越来越多。自定义类型并不能强行将所有内容强加于人,目前,开发人员没有动力去接触这种热铁。可以希望有人提出一个好的建议以使其正常工作,但是目前“每个人”只要听到这个词就会逃脱。:)


1

我猜想,实际原因是PHP开发团队缺乏明确的PHP开发路线图(仅当内部人员在不事先同意5.4应该包含什么功能的情况下决定启动PHP 5.4分支时,才进行激烈的讨论)。我非常喜欢这种语言,但是它的开发方式让我有点担心。


2
在使用PHP 5年后,我在2006年离开了PHP,成为了Python。Python具有令人难以置信的开发流程和良好的领导才能,此外,该语言比PHP更简洁,强大和一致。主要挑战是找到正确的Web框架。我们推出了自己的AppStruct。
gahooa

1
好吧,我们有一个PHP 6路线图。没有帮助;)路线图问题之一是PHP由出现的志愿者驱动(如果他们有“好主意”,我们希望保留它们并尽快添加其功能),突然消失(结婚,换工作,...)
johannes

令人高兴的是,PHP 7取得了成功。
危险89年

5年后的今天,仍然没有“完全的unicode支持” :)
Mchl '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.