乱码的种类很多,产生乱码的原因很也很多。
用搜索引擎找一找,会有成千上万的记录。
我尝试再现一些乱码。
先从文件的开头,BOM开始。
用c语言写一个简单的CGI程序,发送数据到浏览器。
#include <stdio.h>
main(){
printf("Content-Type: text/plain\r\n\r\n");
printf("你好,世界!\n");
}
显示的乱码如下:
ä½ å¥½ï¼Œä¸–ç•Œï¼�
在浏览器里可以有菜单调节,显示出正确的编码。但现在很多浏览器里调节编码的菜单很难找到,那么,怎样不通过调节浏览器来正确显示呢?
一种方案是输出html格式,指定编码;另一种方式是插入BOM.
第一种方式是这样的(使用text/html,指定编码):
#include <stdio.h>
int main(){
printf("Content-Type: text/html\r\n\r\n");
printf("<html><head>");
printf("<meta charset=\"utf-8\"/>");
printf("</head>");
printf("<body>");
printf("<p>你好,世界!</p>");
printf("</body></html>");
return 0;
}
c语言的源文件也必须是UTF8格式的。
第二种方式是这样的(使用text/plain,插入BOM):
#include <stdio.h>
int main(){
printf("Content-Type: text/plain\r\n\r\n");
printf("%c%c%c",0xEF,0xBB,0xBF);
printf("你好,世界!\n");
return 1;
}
同样c语言的源文件也必须是UTF8格式的。
用 0xEF 0xBB 0xBF 三个字节表示UTF8编码的BOM,告诉浏览器,收到的文本文件是UTF8编码的。浏览器就能正确显示出文本。
下面看看“你好,世界!”在变成乱码的时候,为什么会变成那个样子,而不是别的样子。
“你好”的UTF8编码是 "E4BDA0 E5A5BD",在没有指定编码的时候,浏览器按照Unicode码位一个一个解释,E4被解释成为ä,
BD被解释成为½,其余类推,整个字符串被拆解了。
以此推断,浏览器可以直接解释Unicode码。
那么,下面测试把“你好,世界!”的Unicode码直接发送给浏览器,会发生什么。
查询获得整个字符串的Unicode编码是"4F60 597D FF0C 4E16 754C FF01 "
第三种方式是这样的(使用实体字符):
编写如下的程序:
#include <stdio.h>
int main(){
printf("Content-Type: text/html\r\n\r\n");
printf("<html><head></head>");
printf("<body><p>");
printf("%s","你");
printf("%s","好");
printf("%s",",");
printf("%s","世");
printf("%s","界");
printf("%s","!");
printf("</p></body></html>\n");
}
HTML页面不需要指定编码,也没有乱码。
所以,针对HTML页面,使用Unicode实体是最安全的方式,完全避免乱码的出现。
而且,这种方式,c语言的源文件中不必出现汉字,所以源文件随便是什么格式的都可以。
网友评论