我已经阅读了有关此主题的几个内容,但我仍然怀疑我想与社区分享。
我想为我开发的应用程序DaDaBIK添加完整的utf-8支持;该应用程序可以与不同的DBMS一起使用(例如MySQL,PostgreSQL,SQLite)。数据库中使用的字符集可以是任何字符。我不能设置或承担字符集。
我的方法是使用iconv函数转换我在utf-8中从db读取的所有内容,然后在我必须写入数据库时将其转换回原始字符集。这将允许我假设我正在使用utf-8。
正如您可能知道的那样,问题是PHP本身不支持utf-8,即使假设使用mbstring,也有(根据http://www.phpwact.org/php/i18n/utf-8)几个PHP函数可能会产生utf问题-8和DO没有mbstring对应关系,例如PREG扩展名,strcspn,trim,ucfirst,ucwords ....
由于我正在使用一些外部库,例如adodb和htmLawed,我无法控制所有源代码......在这些库中有几种使用这些函数的情况....你有什么建议吗? ?最重要的是,像wordpress等非常受欢迎的应用程序如何处理这个(恕我直言)大问题?我怀疑他们在代码中没有任何“修剪”......他们只是承担风险(例如数据损坏)或者有些东西我看不到?
非常感谢。
答案 0 :(得分:2)
首先: PHP本身就支持UTF-8。只有少数处理字符串的核心函数不应该用在多字节字符串上。
这完全取决于您所谈论的功能以及您使用它们的功能。 PHP字符串是无编码的字节数组。因此,大多数标准函数只适用于原始字节。 trim
只查找字符串开头和结尾的某些字节并将其修剪掉,这对UTF-8编码的字符串完全正常,因为UTF-8完全兼容ASCII。 str_replace
和类似的函数也是如此,它们在字符串中查找字符(字节)并替换或删除它们。
唯一真正的问题是使用偏移量的函数,例如substr
。默认函数使用字节偏移,而您确实需要更智能的字符偏移,它不一定与字节对应。对于这些函数,通常存在mb_
等效函数。
preg_
使用/u
修饰符就可以支持UTF-8了。
如果您的库在可能的多字节字符串上使用substr
,则使用不同的库,因为它是一个错误的库。
有关PHP和字符集的更深入讨论和揭秘,请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。
此外,在数据库中编码字符串并不重要。您可以设置数据库的连接编码,这将导致它为您转换所有内容,并始终以所需的客户端编码返回数据。不需要在PHP中反转所有内容。