乱码问题太变态了,5555~

poor365 2009-01-17 10:34:36
最近碰到一个郁闷的问题:一个简单的php页面,编码设为utf-8,功能是往mysql中一张表mytable中插入一条数据(中文),然后可以将数据根据ID查出并显示在页面上。

我把这个页面放在一台Linux服务器上面运行,插入一条数据(ID:1, VALUE:你好)到mytable中,然后在这个页面上根据ID:1查找正确显示没有出现乱码;然后我把这个页面放在另一台Windows服务器上面运行,插入一条数据(ID:2, VALUE:谢谢)到mytable中,然后根据ID:2查找显示也没有出现乱码。

但是,我通过Windows服务器上的页面查找ID:1的数据,显示是乱码;通过Linux服务器上的页面查找ID:2的数据,也是乱码,也就是说同样的页面通过不同的Apache插入到同一张表中的数据的编码是不同的,这就让人郁闷了,页面内容是一模一样的,操作的表是同一张表mytable(在linux上),两个Apache的默认编码都是设置为AddDefaultCharset utf-8,为什么会有这样的问题?

后来我通过同一台Windows上的Jsp服务器运行一个功能相同的jsp页面来操作同一张表mytable,发现存取都没有问题,读取先前的ID:2数据(通过Windows上的Apache插入)显示没有乱码,读取ID:1的数据是乱码。这就说明问题出在Linux上那个Apache上了

请问各位大侠,Linux上那个Apache有可能是出了什么问题?是不是还有某些地方没有设置好呢?
痛苦死了,对Linux不是很熟悉,恳请帮忙!

...全文
314 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
poor365 2009-01-19
  • 打赏
  • 举报
回复
谢谢!周末弄火车票去了没来跟帖,不好意思。我在mysql_connect()之后,加上mysql_query("set names utf8")这句已经可以以utf8编码正确存储中文了,但是为什么apache与mysql之间传递数据会编码错误,还是一直弄不明白。非常谢谢surfchen ,helloyou0 两位!
yctin 2009-01-17
  • 打赏
  • 举报
回复
两边都用phpmyadmin加入一条相同的数据看看结果
helloyou0 2009-01-17
  • 打赏
  • 举报
回复
想不出来,给个可测试的页面和代码看看?
poor365 2009-01-17
  • 打赏
  • 举报
回复
对啊,都是在IE6.0下面运行的
helloyou0 2009-01-17
  • 打赏
  • 举报
回复
是在同一个浏览器运行的吗?
poor365 2009-01-17
  • 打赏
  • 举报
回复
上面取的表是USERS表不是mytable了,不过本质没区别
poor365 2009-01-17
  • 打赏
  • 举报
回复
数据库是同一个数据库,页面代码也是完全相同的,mysql中数据库、表的默认编码都是utf-8,两个Apache 的默认编码设置也是utf-8。既然我从windows上的php、jsp、java等途径对这个表进行存/取操作都没有任何乱码问题,说明问题只可能是出现在Linux那个Apache上,甚至于我在那个Linux上直接运行java文件操作,结果也都是乱码。mysql应该是没有问题的。

我将这个表的数据mysqldump导出到txt文件中,可以看到其中包含了/*!40101 SET NAMES utf8 */; SQL是:INSERT INTO `USERS` VALUES (1,'你好','你好'),(2,'谢谢','谢谢'),(3,'你好','你好'),(4,'谢谢','谢谢');

而如果在mysqldump导出时指定 --default-character-set=latin1,txt文件中则包含/*!40101 SET NAMES latin1 */;
SQL则为:INSERT INTO `USERS` VALUES (1,'你好','你好');
INSERT INTO `USERS` VALUES (2,'??','??');
INSERT INTO `USERS` VALUES (3,'??','??');
INSERT INTO `USERS` VALUES (4,'谢谢','谢谢');
frederic_zhao 2009-01-17
  • 打赏
  • 举报
回复
数据库是同一个数据库对吧,在终端查看数据显示都是中文的吗?

每次自己遇到乱码问题都在想啥时候我国人民统治C.S界,也让老外尝尝乱码的滋味!
surfchen 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 poor365 的回复:]
为什么那个Linux上的Apache会是这样编码的啊?发现另外一台Linux上相同配置的Apache也是存在这样的问题,Apache配置文件中设置编码到底要如何设置啊?
[/Quote]
和apache无关
surfchen 2009-01-17
  • 打赏
  • 举报
回复
两台服务器连接不同的数据库?

如果是这样。那么在mysql_connect()之后,加上mysql_query("set names utf8");

如果php版本>= 5.2.3,用mysql_set_charset("utf8")。

另外:强烈建议使用mysql_set_charset函数而不是set names语句,后者在某些字符集下会带来安全漏洞。
poor365 2009-01-17
  • 打赏
  • 举报
回复
为什么那个Linux上的Apache会是这样编码的啊?发现另外一台Linux上相同配置的Apache也是存在这样的问题,Apache配置文件中设置编码到底要如何设置啊?
helloyou0 2009-01-17
  • 打赏
  • 举报
回复
以前给别的地方写的乱码的分析,原理一样,供参考
http://www.htkou.net/forum/index.php?id=13067
helloyou0 2009-01-17
  • 打赏
  • 举报
回复
set names utf8 加了没有?
helloyou0 2009-01-17
  • 打赏
  • 举报
回复
2,3是正确的编码
poor365 2009-01-17
  • 打赏
  • 举报
回复
谢谢!<head></head>里面<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />之前有加了,
查询结果:
+----+--------------------------+
| ID | hex(VALUE) |
+----+--------------------------+
| 1 | C3A4C2BDC2A0C3A5C2A5C2BD |
| 2 | E8B0A2E8B0A2 |
| 3 | E4BDA0E5A5BD |
| 4 | C3A8C2B0C2A2C3A8C2B0C2A2 |
+----+--------------------------+
ID:1,你好,Linux插入
ID:2,谢谢,Windows插入
ID:3,你好,Windows插入
ID:4,谢谢,Linux插入
果然是不同的内容
surfchen 2009-01-17
  • 打赏
  • 举报
回复
在html的<head></head>里加入<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />试试看。

如果不行,那么把下面结果贴出来
select ID,hex(VALUE) from mytable;
surfchen 2009-01-17
  • 打赏
  • 举报
回复
你到底试了mysql_query("set names utf8");没?

你那两个错误的VALUE,按照两个hex一个byte,也就是12个bytes。很明显,结果是这样产生的,我用代码描述“谢谢”出错的过程,如下:

shell> php -r 'echo pack("H12","E8B0A2E8B0A2");'|iconv -f latin1 -t utf-8|hexdump

结果如下:
0000000 c3 a8 c2 b0 c2 a2 c3 a8 c2 b0 c2 a2
000000c

我解释一下上面的代码:
php -r 'echo pack("H12","E8B0A2E8B0A2");'//输出的是utf-8的谢谢,我之所以用php的pack来输出,是为了防止你的终端编码和我不一直,又要问一堆东西了。其实这里完全可以用echo -n '谢谢'替代
iconv -f latin1 -t utf-8//把utf-8的“谢谢”认为是latin1编码,于是做了一次latin1到utf-8的处理,实际上是utf-8在做了一次utf-8的编码
hexdump//输出hex结果

而从web角度上看,你的html确实是utf-8,提交的数据也是utf-8。但是mysql client charset却被错误的识别为latin1,于是这里做了一个错误的转换(client->connection,也可能是connection->storage)。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧