1

我有一个与数据库通信的多语言网站,其中包含特定语言的翻译。

比如一个表gender有10行,每行表示一种语言。

+---------+-----------+-----+
| English | French    | etc |
| Male    | Masculine | ... |
+---------+-----------+-----+

某些语言(如中文、希腊语、土耳其语、西班牙语、俄语等)具有 latin1 之外的字符,当我从我网站上的数据库中读取数据时,它们会出现?乱码(mojibake)

那么,我该如何解决这个问题?

我知道我需要在数据库上使用某些排序规则并添加特定的元字符集标记,但它仍然无法正常工作。

 cp1256 | Windows Arabic          | cp1256_general_ci (it's not giving me the correct arabic solution.)
 gbk    | GBK Simplified Chinese  | gbk_chinese_ci    (it's not giving me the correct chinese solution.)
4

4 回答 4

1

Collat​​ion 仅用于排序目的,而 charset 用于存储。显然您正在使用latin1字符集,这很有趣。许多人会建议使用utf-8字符集,因此您现在必须将所有数据转换为该字符集。就个人而言,我会使用二进制数据(binaryvs. charvarbinaryvs. varcharblobvs. text)。如果您需要准确的排序(整理),这只是一个问题,因为二进制排序是不同的。

于 2012-09-26T13:03:42.597 回答
1

在查看多语言系统时,需要考虑系统的很多方面。

您需要确保在整个系统中使用合适的字符编码。在大多数情况下,字符编码的最佳选择是 UTF-8。(在某些情况下 UTF-8 是不够的,在这种情况下有 UTF-16,但这些情况很少,而且 PHP 无论如何都会与 UTF-16 斗争,所以一般都坚持使用 UTF-8你会没事的)。

您需要确保在以下位置使用相同的字符编码:

  • 您的数据库表。
  • 您的网络服务器。
  • 你的 PHP 源代码。

该数据库很容易处理:只需确保所有表的字符集都使用 UTF-8 编码创建。任务完成。

排序规则不太相关——它指定了排序顺序。这当然很重要,但与您看到的乱码文本显示没有任何关系。(值得一提的是,某些字符在不同语言中的排序方式不同,因此如果您需要在单个表中支持多种语言,则几乎不可能选择适合所有人的排序模式,但我不会太担心这一点现在)。

Web 服务器也相对简单,只要您对 Apache 配置(或您使用的任何服务器软件)感到满意。您需要确保所有输出到浏览器的页面都使用 UTF-8 编码发送。

最后,您的 PHP 源代码...

首先,您应该确保在 UTF-8 模式下编辑实际的 PHP 代码文件。否则,如果您的代码中有任何扩展字符,您可能会遇到麻烦。

其次,请注意许多 PHP 的标准字符串处理函数“不支持多字节”。这意味着它们不能与扩展字符集一起正常工作。例如,strlen()将返回字符串在内存中占用的字节数。如果您的字符串包含占用超过一个字节的字符,这将是不正确的。幸运的是,PHP 还提供了一组多字节函数来解决这个问题。因此,例如,不要使用 ,而是strlen()使用mb_strlen()。PHP 手册提供了有关可用函数以及何时使用它们的更多详细信息。

此外,请确保您也使用正确的字符集处理任何传入的发布数据。

希望这会帮助你。这里的关键是确保您的系统在其所有层中使用一致的字符集。当系统中的一个层使用与其他层不同的字符集时,往往会出现看起来怪异的编码错误问题。确保它们都是相同的(最好是 UTF-8),并且你应该处理你的乱码问题。

于 2012-09-26T14:13:30.460 回答
1

您应该使用特定的表格进行翻译,而不是列。在这种情况下,您可以为每个表指定字符集。

此时你有:

+---------+------------+------+
| 英语 | 法语 | 等|
| 男 | 阳刚 | ... |
+---------+------------+------+

你应该有:

性别_zh
+------------+-------------+
| id_gender | 价值 |
+------------+-------------+
| 1 | 男 |
| 2 | 女 |
+------------+-------------+

性别_es
+------------+-------------+
| id_gender | 价值 |
+------------+-------------+
| 1 | 兄弟 |
| 2 | 穆杰 |
+------------+-------------+

性别_fr
......

等等

于 2012-09-26T15:11:02.157 回答
0

最简单的方法是对整个网站使用 UTF-8。UTF-8 可以处理其他编码的所有已知字符。如果您使用的是 mysql,请务必在进行查询之前告诉连接对象使用 UTF-8。我写了一篇关于如何在 PHP 和 MySQL 中使用 UTF-8的短文。

排序规则与字符集不同,它只定义了如何比较两个值(例如用于排序)。

于 2012-09-26T15:22:36.067 回答