2013-03-11 260 views
0

如果语言是英语,我有一个注册表格,它正确对应于db表格。 IF语言是希​​腊语或其他用户名出现在表中作为加密(损坏??)。在数据库表中选择utf8_general_ci。我应该在代码中添加什么内容才能在所有语言中获得相同的结果。 (结果=在db表中可以看到用户的用户名正确)。不同语言的用户

+1

http://kunststube.net/encoding/和http://kunststube.net/frontback/ – 2013-03-11 10:01:08

+0

感谢。你是个好人! – 2013-03-11 10:03:44

回答

1

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

在PHP中一个可以修改标题为这样:

header('Content-type: text/html; charset=utf-8'); 
+0

谢谢,我会试试看。 – 2013-03-11 10:20:07

0

第一个查询之前添加

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); 
+1

更好地使用mysql_set_charset()而不是mysql_query()。 http://www.php.net/manual/en/mysqlinfo.concepts.charset.php。或者甚至更好,使用PDO:http://stackoverflow.com/questions/584676/how-to-make-pdo-run-set-names-utf8-each-time-i-connect-in-zendframework – 2013-03-12 03:16:14

0

UTF8是在PHP非常棘手。一些更多的问题(除了UTF8头和UTF8 DB连接其他2个回答)我知道的:

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

    mb_internal_encoding(“UTF-8”);

  2. 根据你的php版本,你可能需要不同地处理htmlspecialchars(),htmlentities()。

    与htmlspecialchars()一样,htmlentities()采用可选的第三个参数编码,它定义了转换中使用的编码。如果省略,则此参数的缺省值是5.4.0之前的PHP版本中的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 | 
+----+-----------+-----------+----------------+