所以,我在这个系统上构建了很长一段时间,它目前正在向网络浏览器输出 Latin1 (ISO-8859-1),这是组件:
MySQL - 所有数据都使用 Latin1 字符集存储
PHP - 所有 PHP 文本文件都以 Latin1 编码存储在磁盘上
HTML - 输出具有 http-equiv="content-type"content="text/html; charset=iso-8859-1"元标记
因此,我试图了解不同部分的编码如何在我的工作流程中发挥作用。如果我打开一个 PHP 脚本并将其在文本编辑器中的编码更改为 UTF-8,然后将其保存回磁盘并重新加载 Web 浏览器,那么文本就会一团糟——除非文本来自数据库。如果我将数据库的编码更改为 UTF-8 并将 PHP 文件保留在 latin1 中,我必须使用 utf8_decode() 才能正确显示数据。如果我更改 HTML 代码,浏览器将无法正确读取它。
是的,我意识到如果我想“升级”到 UTF8,我必须更新此设置的所有三个部分才能正常工作,但由于它是一个庞大的系统,包含大约 18 万行 PHP 代码和数百万行许多数据库/表中的帖子,我不想在没有正确理解所有内容的情况下开始这样的事情。
我没有想到什么?除了修复之外还有什么能把它搞得一团糟?更改整个 MySQL 安装的编码的过程是什么?更改磁盘上成百上千个 PHP 文件的编码的最简单方法是什么?
幸运的是,META 标签是动态添加的,所以我只会在一个地方更改它:)
让我听听您对此的体验。
最佳答案
这很棘手。
你必须:
- 更改数据库和每个表的字符集/编码——我不太了解 MySQL,但请参阅 here
- 在第一次查询之前,在 PHP 中将客户端编码设置为 UTF-8 (
SET NAMES UTF8
) - 更改元标记和可能的 Content-type header (注意 Content-type header 优先)
- 将所有 PHP 文件转换为不带 BOM 的 UTF-8 - 您可以使用循环和 iconv 轻松完成此操作。
- 最棘手的是:您必须更改大部分字符串函数调用。 Than 意味着
mb_strlen
而不是strlen
,mb_substr
而不是substr
和$str[index]
等
关于php - 更改 MySQL、PHP 脚本、HTML 中的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2988462/