1

我已经阅读了有关此主题的几篇文章,但我仍然想与社区分享一些疑问。

我想为我开发的应用程序DaDaBIK添加完整的utf-8支持;该应用程序可以与不同的 DBMS(如 MySQL、PostgreSQL、SQLite)一起使用。数据库中使用的字符集可以是 ANY。我不能设置或假设字符集。

我的方法是使用 iconv 函数转换我从 utf-8 中的数据库读取的所有内容,然后在我必须写入数据库时​​将其转换回原始字符集。这将允许我假设我正在使用 utf-8。

您可能知道,问题在于 PHP 本身不支持 utf-8,即使假设使用 mbstring,也有(根据http://www.phpwact.org/php/i18n/utf-8)几个 PHP 函数可能会产生 utf-8 问题并且没有 mbstring 对应关系,例如 PREG 扩展、strcspn、trim、ucfirst、ucwords....

由于我使用了一些外部库,例如 adodb 和 htmLawed,我无法控制所有源代码......在这些库中,有几种使用这些函数的案例......你有什么建议吗?最重要的是,wordpress 等非常流行的应用程序如何处理这个(恕我直言大)问题?我怀疑他们在代码中没有任何“修剪”......他们只是冒险(例如数据损坏)或者有什么我看不到?

非常感谢。

4

1 回答 1

2

首先:PHP 本身就支持 UTF-8。只有少数处理字符串的核心函数不应该用于多字节字符串。

这完全取决于您正在谈论的功能以及您使用它们的目的。PHP 字符串是无编码字节数组。因此,大多数标准函数仅适用于原始字节。trim只是在字符串的开头和结尾查找某些字节并将它们修剪掉,这对于 UTF-8 编码的字符串非常有效,因为 UTF-8 完全兼容 ASCII。str_replace在字符串中查找字符(字节)并替换或删除它们的类似函数也是如此。

唯一真正的问题是使用偏移量的函数,例如substr. 默认函数使用字节偏移量,而您确实需要更智能的字符偏移量,它不一定对应于字节。对于这些功能,mb_通常存在等价物。

preg_/u使用修饰符支持 UTF-8 就好了。

例如,如果您有一个库使用substr潜在的多字节字符串,请使用不同的库,因为它是一个坏库。

请参阅每个程序员绝对、积极需要了解的关于使用文本的编码和字符集的知识,以更深入地讨论和揭开 PHP 和字符集的神秘面纱。

此外,字符串在数据库中的编码方式无关紧要。您可以为数据库设置连接编码,这将导致它为您转换所有内容并始终以所需的客户端编码返回您的数据。无需在 PHP 中对所有内容进行图标转换。

于 2012-09-05T11:47:05.560 回答