浏览器如何确定使用的编码?

时间:2017-03-31 19:38:51

标签: html encoding

我知道有两种方法可以设置编码:

  1. 使用Content-Type标头。
  2. 在HTML中使用元标记
  3. 由于Content-Type标头不是必需的,因此需要明确设置(服务器端可以根据需要进行设置),元标记也是可选的。

    如果两者都不存在,浏览器如何确定用于解析内容的编码?

3 个答案:

答案 0 :(得分:1)

他们可以根据启发式

猜测它

我不知道今天的编码器检测编译器有多好,但是MS word在它上面做得非常好,并且识别出我以前从未听过的字符集。您可以使用随机编码打开* .txt文件,然后查看。

  

该算法通常涉及字节模式的统计分析,例如在每个将被检测到的代码页中编码的各种语言的三字符的频率分布;此类统计分析也可用于执行语言检测。

     

https://en.wikipedia.org/wiki/Charset_detection

Firefox使用Mozilla Charset Detectors。它的工作方式解释为here,您还可以change its heuristic preferences

之前使用过的Chrome ICU detector,但已切换到CED差不多2 years ago

没有一种检测算法是完美的,他们可以错误地猜测like this,因为它无论如何只是在猜测!

  

这个过程并非万无一失,因为它取决于统计数据。

这就是着名的Bush hid the facts错误的发生方式。糟糕的猜测也会给系统带来漏洞

  

对于所有那些持怀疑态度的人来说,有一个很好的理由可以明确说明字符编码。当浏览器没有被告知文本的字符编码是什么时,它必须猜测:有时猜测是错误的。黑客可以操纵这个猜测,以便将XSS滑过过滤器,然后欺骗浏览器将其作为活动代码执行。一个很好的例子是Google UTF-7漏洞利用。

     

http://htmlpurifier.org/docs/enduser-utf8.html#fixcharset-none

因此,应始终明确说明编码。

答案 1 :(得分:0)

我遇到了HTML的输出编码问题。如果您要使用.i.e nodejs或golang ...创建网站或网络服务,并且不确定将Content-Type字符集添加到标头中: 例如在golang中:resp.Header.Set("Content-Type", "text/html; charset=GB18030");

答案 2 :(得分:-1)

它在<head>中设置如下:

<meta charset="UTF-8">

我认为如果未在头部设置,浏览器将设置默认编码。