将网站字符编码从iso-8859-1更改为UTF-8

6
大约两年前,我犯了一个错误,开始使用iso-8859-1创建一个大型网站。现在,我在使用ajax向服务器发送数据时遇到一些字符问题,尤其是某些字符无法正常显示。因此,我想切换到使用UTF-8编码。
那么,你认为这样做会有哪些问题?我知道我需要搜索整个网站,将所有的问号替换成实际的字符。但是,除此之外还有其他风险吗?有人之前做过这样的转换吗?
2个回答

7
主要的困难在于确保检查所有数据路径都是UTF-8干净的:
1. 您的网站是否使用数据库?如果是,请将所有表转换为UTF-8或其他Unicode编码,以便正确排序和文本搜索。
2. 您的网站是否使用某种编程语言作为动态内容?(PHP、mod_perl、ASP等?)如果是,请确保您正在使用的特定语言解释器完全了解某种形式的Unicode,并在其输出到Web服务器时检查所需的转换(如果它不是原生使用UTF-8,UTF-16 是接下来最常见的),并检查它是否已配置为使用UTF-8。
3. 您的网站是否有某种后端应用程序服务器?它是否使用UTF-8作为其文本输出?
4. 网页文档中至少有三个不同的地方可以声明字符集。请确保全部更改:
- HTTP Content-Type头部 - 文档标签中的标签 - 如果使用XHTML Strict,则在文档顶部的标记中
这些都是我多年前追踪一些Unicode数据通过一个相对复杂的N层级应用程序的经验教训,发现了如下的转换链:
Latin-1 → UTF-8 → Latin-1 → UTF-8

因此,即使数据最终在浏览器中显示为“UTF-8”,应用程序仍然只能处理与Latin-1相同的子集,这是由于当时工具中Unicode支持不成熟所致。但是,如果您不小心使管道成为UTF-8干净的话,仍然可能会遇到这种奇怪的转换链。
至于您关于搜索Latin-1字符并逐个转换文件的评论,我不会这样做。我会围绕每个现代Linux系统上都有的“iconv”实用程序构建脚本,将系统中的每个文本文件显式地从Latin-1转换为UTF-8。保证没有遗漏。

我们正在使用一个用 PHP 编写的 CMS 来处理编码。它运行在 PostgreSQL 上。在 CMS 中,我只需切换编码,就可以改变所有页面中的内容类型标头... - Nic Hubbard
我敢打赌,这只是改变了CMS声明使用的字符集到mod_php,它控制Apache向浏览器报告的内容。当然,我不会期望它神奇地迁移你数据库中的所有数据。它可能不会转换CMS用于构建页面的现有模板。底线:测试,测试,测试。在数据库中放入一些来自Latin-1集之外的字符,并查看它们是否能够在浏览器中正常显示。如果可以,请确保您没有像上面所示的任何冗余转换。如果不能,则仍然存在将UTF-8压缩为Latin-1的问题。 - Warren Young
想到另一个风险领域。已将其添加到上面的编号列表中。 - Warren Young
我的数据库似乎被编码为SQL_ASCII。我需要将其改为UTF-8,还是可以保留不变? - Nic Hubbard
从纯数据存储和检索的角度来看,这并不重要。但是,如果CMS依赖于数据库进行排序和文本搜索,则数据库了解字符编码很重要。也许在CMS中切换此开关会自动更新所有表格。不要指望它:请检查。 - Warren Young

2

这样的变化几乎涉及到您系统的每个部分。您需要检查所有内容,从数据库到PHP再到HTML和Web浏览器。

启动一个测试站点,并对其进行严格测试(使用各种浏览器在各种平台上进行各种操作)。

我认为实际熟悉UTF-8以及它对软件意味着什么很重要。以下是一些要点:

  • PHP主要是面向字节的。了解字符、代码点、字节之间的区别以及UTF-8和Unicode之间的区别。
  • UTF-8设计得很好。例如,给定两个UTF-8字符串,面向字节的strstr()函数仍将正确运行。
  • 最常见的问题是将UTF-8字符串视为ISO-8859-1,反之亦然,您可能需要添加文档说明您的函数期望哪种编码方式,以使这些错误更少发生。对于您的字符串,使用变量命名约定(以指示它们使用的编码方式)也可能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接