Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.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_Unicode - Fatal编程技术网

什么因素使PHP Unicode不兼容?

什么因素使PHP Unicode不兼容?,php,unicode,Php,Unicode,我能够在脚本中很好地使用UTF-8字符 事实上,这是可能的 还有一种方法处理多字节字符串,但在无数文章中,PHP因缺乏Unicode支持而受到批评 我不明白;为什么说PHP不支持Unicode?几年前PHP启动时,UTF-8实际上不受支持。我们谈论的是一个非Unicode操作系统(如Windows 98/Me)仍然流行的时代,以及其他大型语言(如Delphi)也是非Unicode的时代。并不是所有的语言从第一天起就考虑到了Unicode,在不破坏很多东西的情况下完全将语言更改为Unicode是很

我能够在脚本中很好地使用UTF-8字符

事实上,这是可能的

还有一种方法处理多字节字符串,但在无数文章中,PHP因缺乏Unicode支持而受到批评


我不明白;为什么说PHP不支持Unicode?

几年前PHP启动时,UTF-8实际上不受支持。我们谈论的是一个非Unicode操作系统(如Windows 98/Me)仍然流行的时代,以及其他大型语言(如Delphi)也是非Unicode的时代。并不是所有的语言从第一天起就考虑到了Unicode,在不破坏很多东西的情况下完全将语言更改为Unicode是很困难的。例如,Delphi在一两年前才与Unicode兼容,而Java或C#等其他语言从第一天起就采用Unicode设计

因此,当PHP发展成为PHP3、PHP4和PHP5时,根本没有人决定添加Unicode。为什么?可能是为了与现有脚本保持兼容,或者是因为utf8_de/encode和mb_字符串已经存在并可以工作。我不确定,但我坚信这与有机增长有关。特性并不是默认存在的,它们必须由某人编写,而这在PHP中还没有发生


编辑:好的,我把问题看错了。问题是:字符串如何在内部存储?如果我输入“Währung”或“Écriture”,使用哪种编码来创建所使用的字节?对于PHP,它是带有代码页的ASCII码。这意味着:如果我用ISO-8859-15编码字符串,你用一些中文代码页解码,你会得到奇怪的结果。另一种选择是在C#或Java等语言中,所有内容都存储为Unicode,这意味着:不再有代码页,理论上你不能搞砸。我推荐Unicode和字符集,但本质上可以归结为:字符串如何在内部存储,PHP的答案是“不使用Unicode”,这意味着在处理字符串时必须非常小心和明确,以确保在输入、存储(数据库)和输出期间始终以正确的编码保存字符串,这很容易出错。

所谓的“支持”是指“本机支持”。查看以获取详细信息。

您自己说:为了正确处理包含多字节字符的字符串,您需要使用扩展名。忘记在任何地方使用扩展函数而不是更熟悉的“普通”函数,您的数据就会被破坏。如果您使用的第三方库未更新为在任何地方使用扩展函数,也会发生同样的情况


此外,PHP仍然明确不支持许多扩展,可能是因为不可能做到这一点并保持向下兼容。

许多常见扩展没有unicode支持,或者(更糟糕的是)您需要知道字符串包含unicode/utf-8序列,例如XMLReader。PHP的glob()在win32上调用FindFirstFileA还是FindFirstFileW会有很大的不同。

另一个问题(小得多,但令人惊讶的是经常是麻烦的来源)是PHP无法识别的BOM。

许多字符串函数只是围绕C库等价物的薄型包装,也将所有内容视为字节序列。另一个原因是PHP带来了很多不必要的向后兼容性包袱,因此被3&4中糟糕的设计决策所困扰

也许有了5.3的名称空间,他们终于可以逐步淘汰旧函数了。

问题的核心是“多字节字符”的概念

  • 它泄露了一个实现细节:您应该能够在不知道实现者如何选择表示数据的情况下处理字符的抽象-可能取决于适合他们将所有内容表示为UTF16或UTF32的平台,在这种情况下,所有内容都是多字节的,角色抽象的用户不应该在意这一点
  • 这是一个难题:除了我们都“真正知道”字符串是字节序列这一过时的思维习惯之外,我们现在必须知道,有时字节会聚集在一起形成Unicode字符,并且各地都有处理它的特殊情况
  • 这就像一只老鼠试图吃掉一头大象。通过将Unicode框架化为ASCII的扩展(我们有普通字符串,我们有mb_字符串),它会把事情弄得一团糟,并且会纠结于需要哪些特殊情况来处理需要超过一个字节的有趣扭曲字符。如果将Unicode视为为为所需的任何字符提供了一个抽象空间,那么就可以容纳ASCII,而无需将其视为特例

  • 我认为这主要是一个文化上的困难,而不是技术上的困难

    至于技术问题——在一个基于“一个字符等于一个字节”假设的生态系统中实现unicode并不是一件小事——开发人员本可以复制java或python的大部分成果(后者自2001年左右以来就具备了相当好的和基本上正常工作的unicode兼容性),但他们从来没有这样做过

    当我看书时,我感到眩晕

    首先,该函数被称为
    utf8_encode()
    ;但是,文件中指出,预期的字符串应为ISO-8859-1(又称拉丁语-1)。这就是sooo php,这就是sooo 80年代

    大多数评论者似乎认为unicode是一种负担。有许多建议如何转换“未知内容”字符串,如何处理s“混合编码字符串”(wtf?),或处理通常会导致中断的代码点,因为它们超出了该函数的每个代码点四个字节的限制

    讨论集中在修复上,以消除扭曲或避免该函数行为中有问题的部分。对我来说,这就是sooo-php:每个人都在做
    $str = 'áéóú'; // ISO-8859-1
    mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
    mb_detect_encoding($str, 'UTF-8', true); // false