<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thinking for Fun &#187; 编码</title>
	<atom:link href="http://jsfox.cn/blog/tag/%e7%bc%96%e7%a0%81/feed" rel="self" type="application/rss+xml" />
	<link>http://jsfox.cn/blog</link>
	<description>网络 ● 生活 ● 技术</description>
	<lastBuildDate>Tue, 01 Jun 2010 01:52:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>理清URL编码</title>
		<link>http://jsfox.cn/blog/learning/understand-url-encodin.html</link>
		<comments>http://jsfox.cn/blog/learning/understand-url-encodin.html#comments</comments>
		<pubDate>Mon, 31 May 2010 11:05:23 +0000</pubDate>
		<dc:creator>yongbin</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://jsfox.cn/blog/?p=187</guid>
		<description><![CDATA[URL中，什么字符需要编码？
关于URL编码，RFC1738做了如下的规定：
&#8220;Only alphanumerics [0-9a-zA-Z], the special characters &#8220;$-_.+!*&#8217;(),&#8221; [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.&#8221;
RFC继而说明了保留字、特殊符号、不安全字符的含义——也就是说，下面三类字符可以不经过编码，直接出现在URL上：

[0-9a-zA-Z]
特殊字符：$-_.+!*&#8217;(),
保留字符：&#38;/:;=?@

为了让我们思路更清晰，我们再总结一下，哪些字符必须要编码：

ASCII表中没有对应可显示字符的，例如汉字
不安全字符，包括：#&#8221;%&#60;&#62;[]{}&#124;\^`~
不当做保留字符来使用的保留字符，即&#38;/:;=?@


详见这张图，一目了然（点击看大图）：
如何编码？
众所周知，字符是可由八位字节数（octet）来表示的，八位字节数可用十六进制来表示它的值。如字符“&#60;”的八位字节数十六进制值是3C。在URL中，字符的编码方式为：“%”加上字符的两个十六进制数值。举几个例子：

“&#60;”可以被编码为%3C，空格“SP”可被编码为“%20”
“田”的GB2312编码十六进制值是CC EF，这时“田”的URL编码为%CC%EF
“囧”的GBK编码十六进制值是87 E5，这时“囧”的URL编码为%87%E5
“田”的UTF-8编码十六进制值是E7 94 B0，这时“田”的URL编码为%E7%94%B0

URL中包含汉字时的更多话题
RFC1738没有规定汉字的编码方式，而是让浏览器自己去决定，因此造成了URL汉字编码的不统一。经过研究，对于URL中的“查询字符串”和“路径”中包含汉字，不同浏览器有不同的处理。
1. 查询字符串中包含汉字
在网址输入：http://www.baidu.com/s?wd=田囧 ，敲击回车，使用Fiddler观察浏览器发出的请求（以IE8和Firefox为例）：
IE8将汉字作为GBK编码，直接发往服务器（这其实是不符合RFC规范的）；Firefox则多了一次加%的操作。Windows操作系统是GBK编码。得到结论，地址栏直接访问URL，汉字作为查询字符串(Query string)时，IE和Firefox会使用系统编码发至服务器端，Firefox会按规矩编码。
注意1：不要用Google进行测试，Google的搜索URL（类似：http://www.google.com/#hl=en&#38;source=hp&#38;q=田囧 ），搜索关键词那里不是查询字符串，因为前面有个#……我开始没注意到，被搞迷茫了很久……
注意2：这只是对URL直接访问的规律。如果页面时从链接点击打开的，例如从A页面含中文的链接打开了B页面，那么浏览器对中文的编码取决于A页面的编码。
2. URL路径中包含汉字
在网址直接输入：http://www.hudong.com/wiki/田囧 ，敲击回车，观察请求：
IE8和Firefox都把汉字作为UTF8，按规范进行了URL编码，还好。
总结
什么字符应该编码，什么字符不用编码，URL编码的基本问题，到此已经解决啦。
]]></description>
			<content:encoded><![CDATA[<h2>URL中，什么字符需要编码？</h2>
<p>关于URL编码，<a href="http://tools.ietf.org/html/rfc1738">RFC1738</a>做了如下的规定：</p>
<blockquote><p>&#8220;Only alphanumerics [0-9a-zA-Z], the special characters &#8220;$-_.+!*&#8217;(),&#8221; [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.&#8221;</p></blockquote>
<p>RFC继而说明了保留字、特殊符号、不安全字符的含义——也就是说，下面三类字符可以不经过编码，直接出现在URL上：</p>
<ul>
<li>[0-9a-zA-Z]</li>
<li>特殊字符：$-_.+!*&#8217;(),</li>
<li>保留字符：&amp;/:;=?@</li>
</ul>
<p>为了让我们思路更清晰，我们再总结一下，哪些字符必须要编码：</p>
<ul>
<li>ASCII表中没有对应可显示字符的，例如汉字</li>
<li>不安全字符，包括：#&#8221;%&lt;&gt;[]{}|\^`~</li>
<li>不当做保留字符来使用的保留字符，即&amp;/:;=?@</li>
</ul>
<p><span id="more-187"></span></p>
<p>详见这张图，一目了然（点击看大图）：</p>
<div id="attachment_188" class="wp-caption aligncenter" style="width: 310px"><a href="http://jsfox.cn/blog/wp-content/uploads/2010/05/URLEncodingASCII.png"><img class="size-medium wp-image-188" title="URL编码在ASCII表中的体现" src="http://jsfox.cn/blog/wp-content/uploads/2010/05/URLEncodingASCII-300x147.png" alt="URL编码在ASCII表中的体现" width="300" height="147" /></a><p class="wp-caption-text">URL编码在ASCII表中的体现</p></div>
<h2>如何编码？</h2>
<p>众所周知，字符是可由八位字节数（octet）来表示的，八位字节数可用十六进制来表示它的值。如字符“&lt;”的八位字节数十六进制值是3C。在URL中，字符的编码方式为：“%”加上字符的两个十六进制数值。举几个例子：</p>
<ul>
<li>“&lt;”可以被编码为%3C，空格“<span style="text-decoration: underline;">SP</span>”可被编码为“%20”</li>
<li>“田”的GB2312编码十六进制值是CC EF，这时“田”的URL编码为%CC%EF</li>
<li>“囧”的GBK编码十六进制值是87 E5，这时“囧”的URL编码为%87%E5</li>
<li>“田”的UTF-8编码十六进制值是E7 94 B0，这时“田”的URL编码为%E7%94%B0</li>
</ul>
<h2>URL中包含汉字时的更多话题</h2>
<p>RFC1738没有规定汉字的编码方式，而是让浏览器自己去决定，因此造成了URL汉字编码的不统一。经过研究，对于URL中的“查询字符串”和“路径”中包含汉字，不同浏览器有不同的处理。</p>
<h3>1. 查询字符串中包含汉字</h3>
<p>在网址输入：http://www.baidu.com/s?wd=田囧 ，敲击回车，使用Fiddler观察浏览器发出的请求（以IE8和Firefox为例）：</p>
<div id="attachment_189" class="wp-caption aligncenter" style="width: 310px"><a href="http://jsfox.cn/blog/wp-content/uploads/2010/05/query_string_han.png"><img class="size-medium wp-image-189" title="查询字符串中含有中文" src="http://jsfox.cn/blog/wp-content/uploads/2010/05/query_string_han-300x139.png" alt="查询字符串中含有中文" width="300" height="139" /></a><p class="wp-caption-text">查询字符串中含有中文</p></div>
<p>IE8将汉字作为GBK编码，直接发往服务器（这其实是不符合RFC规范的）；Firefox则多了一次加%的操作。Windows操作系统是GBK编码。得到结论，地址栏直接访问URL，汉字作为查询字符串(Query string)时，IE和Firefox会使用系统编码发至服务器端，Firefox会按规矩编码。</p>
<blockquote><p><strong>注意1</strong>：不要用Google进行测试，Google的搜索URL（类似：http://www.google.com/#hl=en&amp;source=hp&amp;q=田囧 ），搜索关键词那里不是查询字符串，因为前面有个#……我开始没注意到，被搞迷茫了很久……</p>
<p><strong>注意2</strong>：这只是对URL直接访问的规律。如果页面时从链接点击打开的，例如从A页面含中文的链接打开了B页面，那么浏览器对中文的编码取决于A页面的编码。</p></blockquote>
<h3>2. URL路径中包含汉字</h3>
<p>在网址直接输入：http://www.hudong.com/wiki/田囧 ，敲击回车，观察请求：</p>
<div id="attachment_190" class="wp-caption aligncenter" style="width: 310px"><a href="http://jsfox.cn/blog/wp-content/uploads/2010/05/url_directory_han.png"><img class="size-medium wp-image-190" title="路径中含有中文" src="http://jsfox.cn/blog/wp-content/uploads/2010/05/url_directory_han-300x110.png" alt="路径中含有中文" width="300" height="110" /></a><p class="wp-caption-text">路径中含有中文</p></div>
<p>IE8和Firefox都把汉字作为UTF8，按规范进行了URL编码，还好。</p>
<h2>总结</h2>
<p>什么字符应该编码，什么字符不用编码，URL编码的基本问题，到此已经解决啦。</p>
]]></content:encoded>
			<wfw:commentRss>http://jsfox.cn/blog/learning/understand-url-encodin.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Web文档编码的指定</title>
		<link>http://jsfox.cn/blog/learning/web-document-charset.html</link>
		<comments>http://jsfox.cn/blog/learning/web-document-charset.html#comments</comments>
		<pubDate>Fri, 28 May 2010 02:32:36 +0000</pubDate>
		<dc:creator>yongbin</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://jsfox.cn/blog/?p=182</guid>
		<description><![CDATA[Web开发中，文档常常指：(X)HTML文档、XML文档、CSS文档、js文档。指定文档编码的方式有以下几种：
HTTP Header中指定文档编码
在一个典型的HTTP响应头里，Content-Type的值中可以指定文档编码，如：
HTTP/1.1 200 OK
Date        Tue, 11 May 2010 04:09:22 GMT
Server      Apache
Content-Type    text/html; charset=gb2312

对于动态网页，用这种方式指定文档编码，在脚本中直接输出响应头即可：
header( 'Content-type: text/html; charset=gb2312' );

对于静态网页、CSS文件等，则需要在Apache等服务器中配置，例如：
AddType 'text/html; charset=gb2312' html

Content-Type meta元素中指定HTML文档编码

对于HTML文档（或当成HTML解析的XHTML文档），用这种方式指定文档编码，应在&#60;head&#62;标签 里的最上方，加入：
&#60;meta http-equiv="Content-type" content="text/html; /&#62;

指定XML文档编码
对于XML文档，如果不指定编码，则一般会按照UTF-8来解析文档。指定编码的方式是在第一行加入：
&#60;?xml version="1.0" encoding="gb2312"?&#62;

HTML5的charset meta元素
我们潮一些，DOCTYPE为HTML5的文档，可以用带有meta标签的charset属性指定文档编码，类似于这 样：
&#60;meta charset="gb2312"&#62;

用链接的charset属性指定编码
&#60;a&#62;, &#60;link&#62;, &#60;script&#62;元素都可以带有charset属性，用来指定目标文档的编码。例如：
详见：&#60;a href="../index.html" charset="utf-8"&#62;老田的博客&#60;/a&#62;。

但一般html的文档都采用其他方式指定编码，所以此方法常用于指定外部script脚本的文档编码，例如：
&#60;script type="text/javascript" src="main.js" charset="gb2312"&#62;&#60;/script&#62;

使用@charset指定CSS文档编码
如果CSS文档中存在非ASCII字符，为了不让浏览器费力去猜测编码，可以指定CSS文档的编码。一种方式是使用 @charset指定，在CSS文件的第一行：
@charset "utf-8";

编码指定方式的优先级
上述方式指定文档编码，会使用下面的优先级：

 HTTP响应头的Content-Type
 [...]]]></description>
			<content:encoded><![CDATA[<p>Web开发中，文档常常指：(X)HTML文档、XML文档、CSS文档、js文档。指定文档编码的方式有以下几种：</p>
<h2>HTTP Header中指定文档编码</h2>
<p>在一个典型的HTTP响应头里，Content-Type的值中可以指定文档编码，如：</p>
<pre>HTTP/1.1 200 OK
Date        Tue, 11 May 2010 04:09:22 GMT
Server      Apache
Content-Type    text/html; charset=gb2312
</pre>
<p>对于动态网页，用这种方式指定文档编码，在脚本中直接输出响应头即可：</p>
<pre>header( 'Content-type: text/html; charset=gb2312' );
</pre>
<p>对于静态网页、CSS文件等，则需要在Apache等服务器中配置，例如：</p>
<pre>AddType 'text/html; charset=gb2312' html
</pre>
<h2>Content-Type meta元素中指定HTML文档编码</h2>
<p><span id="more-182"></span></p>
<p>对于HTML文档（或当成HTML解析的XHTML文档），用这种方式指定文档编码，应在&lt;head&gt;标签 里的最上方，加入：</p>
<pre>&lt;meta http-equiv="Content-type" content="text/html; /&gt;
</pre>
<h2>指定XML文档编码</h2>
<p>对于XML文档，如果不指定编码，则一般会按照UTF-8来解析文档。指定编码的方式是在第一行加入：</p>
<pre>&lt;?xml version="1.0" encoding="gb2312"?&gt;
</pre>
<h2>HTML5的charset meta元素</h2>
<p>我们潮一些，DOCTYPE为HTML5的文档，可以用带有meta标签的charset属性指定文档编码，类似于这 样：</p>
<pre>&lt;meta charset="gb2312"&gt;
</pre>
<h2>用链接的charset属性指定编码</h2>
<p>&lt;a&gt;, &lt;link&gt;, &lt;script&gt;元素都可以带有charset属性，用来指定目标文档的编码。例如：</p>
<pre>详见：&lt;a href="../index.html" charset="utf-8"&gt;老田的博客&lt;/a&gt;。
</pre>
<p>但一般html的文档都采用其他方式指定编码，所以此方法常用于指定外部script脚本的文档编码，例如：</p>
<pre>&lt;script type="text/javascript" src="main.js" charset="gb2312"&gt;&lt;/script&gt;
</pre>
<h2>使用@charset指定CSS文档编码</h2>
<p>如果CSS文档中存在非ASCII字符，为了不让浏览器费力去猜测编码，可以指定CSS文档的编码。一种方式是使用 @charset指定，在CSS文件的第一行：</p>
<pre>@charset "utf-8";
</pre>
<h2>编码指定方式的优先级</h2>
<p>上述方式指定文档编码，会使用下面的优先级：</p>
<ol>
<li> HTTP响应头的Content-Type</li>
<li> XML的首行声明</li>
<li> meta标签charset声明</li>
<li> 链接的charset属性</li>
</ol>
<p>例如对于一个CSS文件，它的编码优先级会按照下面的顺序指定：</p>
<ol>
<li> HTTP Content-Type</li>
<li> @charset rule</li>
<li> &lt;link charset=&#8221;..&#8221; rel=&#8221;stylesheet&#8221; … /&gt;</li>
</ol>
<h2>总结</h2>
<p>本文总结了Web文档（包括HTML, XHTML, XML, CSS, JS）的编码指定方式。比较常见的是(X)HTML文档中用meta标签指定编码，但优先级不如HTTP响应头高。外部js/css文件指定编码的方法也不尽相同，js文件用引用它的script tag charset attribute指定，css文件用文件开头的@charset指定。</p>
]]></content:encoded>
			<wfw:commentRss>http://jsfox.cn/blog/learning/web-document-charset.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

