我有一个与数据库通信的多语言网站,该数据库包含特定于语言的翻译。
例如,表性别有10行,每行表示一种语言。
+---------+-----------+-----+
| English | French | etc |
| Male | Masculine | ... |
+---------+-----------+-----+
某些语言(如中文,希腊语,土耳其语,西班牙语,俄语等)的字符不在latin1之内,当我从我的网站上的数据库中读取数据时,它们会出现?
并出现乱码< EM>(变为乱码)
那么,我该如何解决这个问题呢?
我知道我需要在数据库上使用某些排序规则并添加特定的元字符集标记,但它仍然无效。
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.)
答案 0 :(得分:1)
排序规则仅用于排序,而charset用于存储。显然你正在使用latin1
字符集,这很有趣。许多人建议使用utf-8
字符集,因此您必须立即将所有数据转换为该字符集。就个人而言,我会使用二进制数据(binary
与char
,varbinary
与varchar
,blob
与text
)。如果您需要准确的排序(整理),这只是一个问题,因为二进制排序是不同的。
答案 1 :(得分:1)
在查看多语言系统时,需要考虑系统的整个区域。
您需要确保在整个系统中使用合适的字符编码。在大多数情况下,字符编码的最佳选择是UTF-8。 (在某些情况下,UTF-8是不够的,对于这种情况,有UTF-16,但这些情况很少,而且无论如何PHP都会遇到UTF-16,所以一般都坚持使用UTF-8你会没事的。)
您需要确保在以下位置使用相同的字符编码:
数据库易于处理:只需确保所有表都使用UTF-8编码为其字符集创建。完成工作。
排序规则不太相关 - 这指定了排序顺序。这当然很重要,但与您看到的乱码文本显示没有任何关联。 (值得一提的是,有些字符在不同语言中的排序方式不同,所以如果你需要在一个表中支持多种语言,几乎不可能选择适合每个人的整理模式,但我不会太担心这个问题。现在)。
Web服务器也相对简单,只要您熟悉Apache配置(或您正在使用的任何服务器软件)。您需要确保输出到浏览器的所有页面都使用UTF-8编码发送。
最后,您的PHP源代码......
首先,您应确保以UTF-8模式编辑实际的PHP代码文件。否则,如果您的代码中包含任何扩展字符,则可能会遇到任何问题。
其次,请注意许多PHP的标准字符串处理函数“不是多字节感知”。这意味着它们无法与扩展字符集一起正常工作。例如,strlen()
将返回字符串在内存中占用的字节数。如果您的字符串包含占用多个字节的字符,则这将是不正确的。幸运的是,PHP还提供了一组多字节函数来解决这个问题。例如,不要使用strlen()
,而是使用mb_strlen()
。 PHP手册提供了有关可用功能以及何时使用它们的更多详细信息。
此外,请确保您使用正确的字符集处理任何传入的发布数据。
希望这会对你有所帮助。这里的关键是确保您的系统在其所有层中使用一致的字符集。当系统中的一个图层使用与其他图层不同的字符集时,往往会出现奇怪的编码错误问题。确保它们完全相同(最好是UTF-8),你应该处理你的乱码问题。
答案 2 :(得分:1)
您应该使用特定表进行转换,而不是列。在这种情况下,您可以为每个表指定字符集。
此刻你有:
+---------+-----------+-----+ | English | French | etc | | Male | Masculine | ... | +---------+-----------+-----+
你应该:
gender_en +-----------+--------------+ | id_gender | value | +-----------+--------------+ | 1 | Male | | 2 | Female | +-----------+--------------+ gender_es +-----------+--------------+ | id_gender | value | +-----------+--------------+ | 1 | Hombre | | 2 | Mujer | +-----------+--------------+ gender_fr .....
等等
答案 3 :(得分:0)
最简单的方法是在整个网站上使用UTF-8。 UTF-8可以与其他编码的所有已知字符一起使用。如果您使用的是mysql,则在进行查询之前告诉连接对象使用UTF-8非常重要。我写了一篇关于如何使用UTF-8 in PHP and MySQL的简短文章。
排序规则与字符集不同,它只定义两个值的比较方式(例如排序)。