我有一个多语言的网站,与数据库沟通,其中包含特定语言的翻译。
例如,表性别有10行,每行表示一种语言。
+---------+-----------+-----+
| English | French | etc |
| Male | Masculine | ... |
+---------+-----------+-----+有些语言(如汉语、希腊语、土耳其语、西班牙语、俄语等)在latin1之外有字符,当我从我的网站上的数据库中读取数据时,它们会出现?和混淆符号(mojibake)。
那我该怎么解决这个问题?
我知道我需要在db上使用某些排序规则,并添加特定的元字符集标记,但它仍然不起作用。
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.)发布于 2012-09-26 14:13:30
在查看多语言系统时,您的系统中有大量需要考虑的区域。
您需要确保在整个系统中使用合适的字符编码。在大多数情况下,字符编码的最佳选择是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),并且你应该处理你的错误角色问题。
发布于 2012-09-26 13:03:42
排序规则仅用于排序,而字符集用于存储。显然,您使用的是latin1字符集,这很有趣。许多人建议使用utf-8字符集,因此现在必须将所有数据转换为该字符集。就我个人而言,我会使用二进制数据(binary与char,varbinary与varchar,blob与text)。如果您需要精确的排序(排序),这只是一个问题,因为二进制排序是不同的。
发布于 2012-09-26 15:22:36
最简单的方法将是使用UTF-8的整个网站。UTF-8可以处理其他编码的所有已知字符。如果您正在使用mysql,那么在进行查询之前告诉连接对象使用UTF-8是很重要的。我写了一篇关于如何使用PHP和MySQL中的UTF-8的短文。
排序规则与字符集不一样,它只定义如何比较两个值(例如,排序)。
https://stackoverflow.com/questions/12601887
复制相似问题