乱码(一)

作者: aubell | 来源:发表于2020-03-23 13:57 被阅读0次

乱码的种类很多,产生乱码的原因很也很多。

用搜索引擎找一找,会有成千上万的记录。

我尝试再现一些乱码。

先从文件的开头,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","&#x4f60;");
  printf("%s","&#x597d;");
  printf("%s","&#xFF0c;");
  printf("%s","&#x4E16;");
  printf("%s","&#x754c;");
  printf("%s","&#xff01;");
  printf("</p></body></html>\n");
}

HTML页面不需要指定编码,也没有乱码。
所以,针对HTML页面,使用Unicode实体是最安全的方式,完全避免乱码的出现。
而且,这种方式,c语言的源文件中不必出现汉字,所以源文件随便是什么格式的都可以。

相关文章

网友评论

    本文标题:乱码(一)

    本文链接:https://www.haomeiwen.com/subject/kqasyhtx.html