0

如果语言是英语,我有一个与 db 表正确对应的注册表单。如果语言是希腊语或其他,则用户名在表中显示为加密(损坏??)。在 db 表中选择了 utf8_general_ci。为了在所有语言中获得相同的结果,我应该在我的代码中添加什么。(结果 = 在 db 表中正确查看用户的用户名)。

4

3 回答 3

1

确保提供结果的页面与数据库的编码具有相同的编码。如果您的表中有 UTF-8 数据,但显示这些数据的页面例如是 ISO-8859-1,则 ISO-8859-1 字符集范围之外的字符将显示为奇怪。

在 PHP 中,可以为此修改标题:

header('Content-type: text/html; charset=utf-8');
于 2013-03-11T10:07:09.443 回答
0

在您的第一个查询之前添加

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");
于 2013-03-11T10:43:55.920 回答
0

UTF8 在 php 中非常棘手。还有一些问题(除了其他 2 个答案中的 utf8 标头和 utf8 db 连接)我知道:

  1. 您将需要使用mbstring 函数。例如,substr() 可能需要替换为 mb_substr() 函数。有关字符串函数的完整列表。看这里。要让 php 知道您预期的内部编码,请在脚本开头调用此函数:

    mb_internal_encoding("UTF-8");

  2. 根据您的 php 版本,您可能必须以不同方式处理 htmlspecialchars()、htmlentities()。

    与 htmlspecialchars() 一样,htmlentities() 采用可选的第三个参数 encoding 来定义转换中使用的编码。如果省略,则此参数的默认值在 PHP 5.4.0 之前的版本中为 ISO-8859-1,从 PHP 5.4.0 开始为 UTF-8。

  3. 使用 mysql LENGTH() 函数的旧查询可能不再是我们想要的,因为 length() 返回字节长度,而不是字符长度。我们可能需要更新它们以使用 CHAR_LENGTH()。但是,这一切都取决于上下文!在下面的示例中,中文列有 3 个字符,但每个字符占用 3 个字节。

mysql> select *, length(d), char_length(d)  from t where id=3;
+----+-----------+-----------+----------------+
| id | d         | length(d) | char_length(d) |
+----+-----------+-----------+----------------+
|  3 | 被冻死 |         9 |              3 |
+----+-----------+-----------+----------------+
于 2013-03-12T03:09:39.237 回答