写的服务器打开一个网页,汉字显示乱码,英文正常显示。
排查许久,因为服务器接受请求发送网页,发送端专门标识了charset:utf-8
,查阅的资料都说要将编码转义,设置为utf-8
sprintf( header, "HTTP/1.1 %d %s\r\nServer: okokme\r\nContent-Length: %d\r\nContent-Type: %s;\r\ncharset:utf-8\r\n\r\n", num, info, int(filestat.st_size - start), type );
许久后意识到原来是未设置HTML编码:这里在对应的网页html代码中也相应的设置的是utf-8 (位置在head中)
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
ok成功显示汉字!
过程为:程序中的中文字符—>服务器—>进行解码—>浏览器—>编码进行显示
顺便根据这个问题说一下关于编码的知识及中文在网络上传输的过程。
一、字符编码的发展
发展:英文字符集:ascii编码————不同国家文字字符集:ANSI编码(GBK、JIS等)————全世界统一字符集:UNICODE编码(UTF—8,UTF—16等),如下图
二、字符集
在计算机底层中数据存储的都是二进制数据,要想获取真正有意义的字符就必须让二进制与每一个字符对应起来,这种关系就形成了一张编码表。
常见字符集:
- iso-8859-1 拉丁码表 latin,表示西欧语言,使用一个字节即8位表示数据
- GB2312 简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节都是开头为1,都为负数。
- GBK 目前最常用的中文码表,2万的中文和符号。用两个字节表示数据。
- unicode 国际标准码,无论是什么文字,都用两个字节存储
- UTF-8 基于unicode,一个字节就可以存储数据,不用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息。
(Linux 默认使用的iso-88059-1,win32默认使用的GB2312)
三、中文在网络上的传播过程
- 1.字符转义:浏览器对汉字通过某种编码方式进行url编码转义,转译成为ascii以便进行下一步。这里就是get和pos请求涉及到的 地方,get肯定url编码转义,post中的urlcode与之类似。
- 2.字符编码:浏览器将上一步骤转义的字符按照ascii编码为字节;
- 3.字符解码:服务器将传输过来的字节按照ascii解码为字符,此步骤web server内部已经帮我们实现;
- 4.字符反转义:服务器将字符按照utf-8或某种编码方式进行url编码反转义为汉字,此过程中开发常用到request可以自定义字符转义解码方式;
- 5、字符转义:服务器将响应头字符按照某种编码方式url编码转义,此过程中开发常用response定义url编码;
- 6、字符编码:服务器对url编码转义后的响应头,与响应体进行二进制编码,webserver内部实现;
- 7、字符解码:浏览器对响应头与响应体按照ascii解码为字符;
- 8、字符反转义:浏览器响应头进行url编码反转义,对响应体查看content-type来进行html解析或者图片解析;
简而言之:
中文传输过程为:
浏览器中的中文字符—>进行编码—>服务器—>进行解码—>程序;
程序中的中文字符—>服务器—>进行解码—>浏览器—>编码进行显示
四、乱码产生原因及结局方式
(1)、浏览器中的中文字符以GBK进行编码,以字节流传输到服务器,服务器再以iso-8859-1进行解码,以字符的形式传输给程序。
因为iso-8859-1编码集不支持中文字符,所有解码后的字符都是西欧字符,把这些字符传输给程序就产生了乱码;
针对这个原因,只要把服务器的编码集设置为utf-8即可;
(2)、程序中的中文字符原样传输到服务器,服务器要先对中文字符进行编码再传输给浏览器,但因为iso-8859-1编码集不支持中文字符,所以在字符集中查找不到对应的编码,编码后就变成了问号,传输给了浏览器并显示;
解决:将服务器编码集设置为UTF-8;
将浏览器编码集设置为UTF-8;
(3)未设置html编码
在代码中设置相应的UTF-8
<meta http-equiv="Content-Type" content="text/html ; charset=utf-8">
部分摘自:https://blog.csdn.net/xcymorningsun/article/details/78420752?utm_source=blogxgwz3
https://blog.csdn.net/dl18215164175/article/details/72512131