中文乱码

来源:互联网 发布:达内云笔记数据库 编辑:程序博客网 时间:2024/04/27 05:35

乱码是每个程序员的噩梦,是每个程序员必然经过的一道坎。只不过有的程序员经常做噩梦,我又遇到了Html乱码。。。

只要有IO的地方,大多会出现乱码。乱码本质上是序列化数据和反序列化数据使用不同的标准造成的。

我用utf-8的编码格式编辑了一个html文件,编辑器中汉字显示良好。

启动nginx,访问html。

浏览器中文字乱码。(无法辨认是乱码,方框是缺少字符集)

Fuck Egg!!!


分析一下,
编辑内容,保存文件。这个过程编辑器把内容数据以utf-8的格式序列化到磁盘上。

浏览器访问,nginx访问磁盘,读取文件,这里读取的原始字节,返回给浏览器。

浏览器解析nginx的响应,组织html排列,计算js,渲染css。页面中的汉字是无法辨认的。

我查看了浏览器的配置,我的首选语言是zh_CN,于是浏览器默认为我选择了字符编码GBK。

整个过程简化一下,就是浏览器以GBK的格式反序列化一个文件,而这个文件是用utf-8序列化的。


第一我把html文件以GBK的格式序列化到磁盘上,这样整个序列化反序列化过程就一致了,世界就和谐了。但是如果有人的首选语言不是zh_CN,那他的字符编码也不是GBK,那样,我们还是没有摆脱噩梦。

第二指定浏览器的字符编码方式,每个站点,每个html文件的序列化反序列化过程都一致。在<head></head>中加入元数据

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />。

加入上述元数据,世界和谐了。(实际上,更好更通行的方式是网站根据请求中的首选语言信息,重定位到相应的语言html)


CS架构的程序中乱码也是这个道理,典型的就是数据库。


that is all right !!! go to bed。

========================================================================

接着补充一下动态脚本语言生成内容的情况。

<%@ page language="java"  pageEncoding="gbk"%>
<!DOCTYPE html>
<html lang="zh-CN" dropEffect="none" class="no-js no-auth">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<body>

你好哇,乱码

</body>

<html>

这是一个最简单的jsp页面。但是输出在浏览器上是乱码。

用上面的分析套路,页面出现了乱码,说明了浏览器的解码和内容的编码格式不一致造成的。

但是我们使用了<meta http-equiv="Content-Type" content="text/html; charset=utf-8">为什么不起作用呢?

因为这个页面的内容不是nginx访问磁盘直接得来的,而是jsp容器生成的。jsp容器生成,使得内容被jsp容器读入并展开jsp动态脚本内容,最后将内容输出到浏览器。

<%@ page language="java"  pageEncoding="gbk"%>这个标签告诉了jsp容器使用gbk格式编码,但是<meta http-equiv="Content-Type" content="text/html; charset=utf-8">告诉浏览器使用utf8解码,fuck,噩梦出现了。

编辑jsp使用A编码,<meta http-equiv="Content-Type" content="text/html; charset=utf-8">标签指定A解码,jsp容器使用A编码向浏览器输出,浏览器根据meta标签使用A来解析html树。这样世界就和谐了。

so far so good

0 0
原创粉丝点击