<?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/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>Challenge everything! &#187; Encoding</title>
	<atom:link href="http://blogs.gnome.org/raywang/category/encoding/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.gnome.org/raywang</link>
	<description>Ray Wang&#039;s notes</description>
	<lastBuildDate>Mon, 30 May 2011 03:11:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license>		<item>
		<title>字符编码笔记：ASCII，Unicode和UTF-8</title>
		<link>http://blogs.gnome.org/raywang/2008/05/07/%e5%ad%97%e7%ac%a6%e7%bc%96%e7%a0%81%e7%ac%94%e8%ae%b0%ef%bc%9aascii%ef%bc%8cunicode%e5%92%8cutf-8/</link>
		<comments>http://blogs.gnome.org/raywang/2008/05/07/%e5%ad%97%e7%ac%a6%e7%bc%96%e7%a0%81%e7%ac%94%e8%ae%b0%ef%bc%9aascii%ef%bc%8cunicode%e5%92%8cutf-8/#comments</comments>
		<pubDate>Wed, 07 May 2008 05:59:00 +0000</pubDate>
		<dc:creator>raywang</dc:creator>
				<category><![CDATA[Encoding]]></category>

		<guid isPermaLink="false">http://raywang.yo2.cn/articles/%e5%ad%97%e7%ac%a6%e7%bc%96%e7%a0%81%e7%ac%94%e8%ae%b0%ef%bc%9aascii%ef%bc%8cunicode%e5%92%8cutf-8.html</guid>
		<description><![CDATA[&#60;br&#62; <a href="http://blogs.gnome.org/raywang/2008/05/07/%e5%ad%97%e7%ac%a6%e7%bc%96%e7%a0%81%e7%ac%94%e8%ae%b0%ef%bc%9aascii%ef%bc%8cunicode%e5%92%8cutf-8/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>非常有用，有必须澄明一下，摘自：http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html</p>
<div class="entry-content">
<div class="entry-body">
<p>今天中午，我突然想搞清楚Unicode和UTF-8之间的关系，于是就开始在网上查资料。</p>
</div>
<div class="entry-more">
<p>结果，这个问题比我想象的复杂，从午饭后一直看到晚上9点，才算初步搞清楚。</p>
<p>下面就是我的笔记，主要用来整理自己的思路。但是，我尽量试图写得通俗易懂，希望能对其他朋友有用。毕竟，字符编码是计算机技术的基石，想要熟练使用计算机，就必须懂得一点字符编码的知识。</p>
<p><strong>1. ASCII码</strong></p>
<p>我们知道，在计算机内部，所有的信息最终都表示为一个二进制的字符串。每一个二进制位（bit）有0和1两种状态，因此八个二进制位就可以组合出 256种状态，这被称为一个字节（byte）。也就是说，一个字节一共可以用来表示256种不同的状态，每一个状态对应一个符号，就是256个符号，从 0000000到11111111。</p>
<p>上个世纪60年代，美国制定了一套字符编码，对英语字符与二进制位之间的关系，做了统一规定。这被称为ASCII码，一直沿用至今。</p>
<p>ASCII码一共规定了128个字符的编码，比如空格&ldquo;SPACE&rdquo;是32（二进制00100000），大写的字母A是65（二进制01000001）。这128个符号（包括32个不能打印出来的控制符号），只占用了一个字节的后面7位，最前面的1位统一规定为0。</p>
<p><strong>2、非ASCII编码</strong></p>
<p>英语用128个符号编码就够了，但是用来表示其他语言，128个符号是不够的。比如，在法语中，字母上方有注音符号，它就无法用ASCII码表示。 于是，一些欧洲国家就决定，利用字节中闲置的最高位编入新的符号。比如，法语中的é的编码为130（二进制10000010）。这样一来，这些欧洲国家使 用的编码体系，可以表示最多256个符号。</p>
<p>但是，这里又出现了新的问题。不同的国家有不同的字母，因此，哪怕它们都使用256个符号的编码方式，代表的字母却不一样。比如，130在法语编码 中代表了é，在希伯来语编码中却代表了字母Gimel (&#1490;)，在俄语编码中又会代表另一个符号。但是不管怎样，所有这些编码方式中，0&mdash;127表示的符号是一样的，不一样的只是128&mdash;255的这一段。</p>
<p>至于亚洲国家的文字，使用的符号就更多了，汉字就多达10万左右。一个字节只能表示256种符号，肯定是不够的，就必须使用多个字节表达一个符号。 比如，简体中文常见的编码方式是GB2312，使用两个字节表示一个汉字，所以理论上最多可以表示256&#215;256=65536个符号。</p>
<p>中文编码的问题需要专文讨论，这篇笔记不涉及。这里只指出，虽然都是用多个字节表示一个符号，但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。</p>
<p><strong>3.Unicode</strong></p>
<p>正如上一节所说，世界上存在着多种编码方式，同一个二进制数字可以被解释成不同的符号。因此，要想打开一个文本文件，就必须知道它的编码方式，否则用错误的编码方式解读，就会出现乱码。为什么电子邮件常常出现乱码？就是因为发信人和收信人使用的编码方式不一样。</p>
<p>可以想象，如果有一种编码，将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码，那么乱码问题就会消失。这就是Unicode，就像它的名字都表示的，这是一种所有符号的编码。</p>
<p>Unicode当然是一个很大的集合，现在的规模可以容纳100多万个符号。每个符号的编码都不一样，比如，U+0639表示阿拉伯字母Ain，U+0041表示英语的大写字母A，U+4E25表示汉字&ldquo;严&rdquo;。具体的符号对应表，可以查询<a target="_blank" href="http://www.unicode.org/">unicode.org</a>，或者专门的<a target="_blank" href="http://www.chi2ko.com/tool/CJK.htm">汉字对应表</a>。</p>
<p><strong>4. Unicode的问题</strong></p>
<p>需要注意的是，Unicode只是一个符号集，它只规定了符号的二进制代码，却没有规定这个二进制代码应该如何存储。</p>
<p>比如，汉字&ldquo;严&rdquo;的unicode是十六进制数4E25，转换成二进制数足足有15位（100111000100101），也就是说这个符号的表示至少需要2个字节。表示其他更大的符号，可能需要3个字节或者4个字节，甚至更多。</p>
<p>这里就有两个严重的问题，第一个问题是，如何才能区别unicode和ascii？计算机怎么知道三个字节表示一个符号，而不是分别表示三个符号 呢？第二个问题是，我们已经知道，英文字母只用一个字节表示就够了，如果unicode统一规定，每个符号用三个或四个字节表示，那么每个英文字母前都必 然有二到三个字节是0，这对于存储来说是极大的浪费，文本文件的大小会因此大出二三倍，这是无法接受的。</p>
<p>它们造成的结果是：1）出现了unicode的多种存储方式，也就是说有许多种不同的二进制格式，可以用来表示unicode。2）unicode在很长一段时间内无法推广，直到互联网的出现。</p>
<p><strong>5.UTF-8</strong></p>
<p>互联网的普及，强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32，不过在互联网上基本不用。<strong>重复一遍，这里的关系是，UTF-8是Unicode的实现方式之一。</strong></p>
<p>UTF-8最大的一个特点，就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号，根据不同的符号而变化字节长度。</p>
<p>UTF-8的编码规则很简单，只有二条：</p>
<p>1）对于单字节的符号，字节的第一位设为0，后面7位为这个符号的unicode码。因此对于英语字母，UTF-8编码和ASCII码是相同的。</p>
<p>2）对于n字节的符号（n&gt;1），第一个字节的前n位都设为1，第n+1位设为0，后面字节的前两位一律设为10。剩下的没有提及的二进制位，全部为这个符号的unicode码。</p>
<p>下表总结了编码规则，字母x表示可用编码的位。</p>
<blockquote>
<div>
<p>Unicode符号范围   |        UTF-8编码方式<br />
(十六进制)          |              （二进制）<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
0000 0000-0000 007F | 0xxxxxxx<br />
0000 0080-0000 07FF | 110xxxxx 10xxxxxx<br />
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx<br />
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx</p>
</div>
</blockquote>
<p>下面，还是以汉字&ldquo;严&rdquo;为例，演示如何实现UTF-8编码。</p>
<p>已知&ldquo;严&rdquo;的unicode是4E25（100111000100101），根据上表，可以发现4E25处在第三行的范围内（0000 0800-0000 FFFF），因此&ldquo;严&rdquo;的UTF-8编码需要三个字节，即格式是&ldquo;1110xxxx 10xxxxxx 10xxxxxx&rdquo;。然后，从&ldquo;严&rdquo;的最后一个二进制位开始，依次从后向前填入格式中的x，多出的位补0。这样就得到了，&ldquo;严&rdquo;的UTF-8编码是 &ldquo;11100100 10111000 10100101&rdquo;，转换成十六进制就是E4B8A5。</p>
<p><strong>6. Unicode与UTF-8之间的转换</strong></p>
<p>通过上一节的例子，可以看到&ldquo;严&rdquo;的Unicode码是4E25，UTF-8编码是E4B8A5，两者是不一样的。它们之间的转换可以通过程序实现。</p>
<p>在Windows平台下，有一个最简单的转化方法，就是使用内置的记事本小程序Notepad.exe。打开文件后，点击&ldquo;文件&rdquo;菜单中的&ldquo;另存为&rdquo;命令，会跳出一个对话框，在最底部有一个&ldquo;编码&rdquo;的下拉条。</p>
<p><a href="http://www.ruanyifeng.com/blog/2007/10/bg2007102801.jpg"><img width="500" height="227" src="http://www.ruanyifeng.com/blog/2007/10/bg2007102801-thumb.jpg" alt="bg2007102801.jpg"></a></p>
<p>里面有四个选项：ANSI，Unicode，Unicode big endian 和 UTF-8。</p>
<p>1）ANSI是默认的编码方式。对于英文文件是ASCII编码，对于简体中文文件是GB2312编码（只针对Windows简体中文版，如果是繁体中文版会采用Big5码）。</p>
<p>2）Unicode编码指的是UCS-2编码方式，即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。</p>
<p>3）Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。</p>
<p>4）UTF-8编码，也就是上一节谈到的编码方法。</p>
<p>选择完&rdquo;编码方式&ldquo;后，点击&rdquo;保存&ldquo;按钮，文件的编码方式就立刻转换好了。</p>
<p><strong>7. Little endian和Big endian</strong></p>
<p>上一节已经提到，Unicode码可以采用UCS-2格式直接存储。以汉字&rdquo;严&ldquo;为例，Unicode码是4E25，需要用两个字节存储，一个字节 是4E，另一个字节是25。存储的时候，4E在前，25在后，就是Big endian方式；25在前，4E在后，就是Little endian方式。</p>
<p>这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中，小人国里爆发了内战，战争起因是人们争论，吃鸡蛋时究竟是从大头(Big- Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情，前后爆发了六次战争，一个皇帝送了命，另一个皇帝丢了王位。</p>
<p>因此，第一个字节在前，就是&rdquo;大头方式&ldquo;（Big endian），第二个字节在前就是&rdquo;小头方式&ldquo;（Little endian）。</p>
<p>那么很自然的，就会出现一个问题：计算机怎么知道某一个文件到底采用哪一种方式编码？</p>
<p>Unicode规范中定义，每一个文件的最前面分别加入一个表示编码顺序的字符，这个字符的名字叫做&rdquo;零宽度非换行空格&ldquo;（ZERO WIDTH NO-BREAK SPACE），用FEFF表示。这正好是两个字节，而且FF比FE大1。</p>
<p>如果一个文本文件的头两个字节是FE FF，就表示该文件采用大头方式；如果头两个字节是FF FE，就表示该文件采用小头方式。</p>
<p><strong>8. 实例</strong></p>
<p>下面，举一个实例。</p>
<p>打开&rdquo;记事本&ldquo;程序Notepad.exe，新建一个文本文件，内容就是一个&rdquo;严&ldquo;字，依次采用ANSI，Unicode，Unicode big endian 和 UTF-8编码方式保存。</p>
<p>然后，用文本编辑软件<a target="_blank" href="http://www.google.cn/search?aq=t&amp;oq=UltraEdit&amp;complete=1&amp;hl=zh-CN&amp;newwindow=1&amp;rlz=1B3GGGL_zh-CNCN216CN216&amp;q=ultraedit+%E4%B8%8B%E8%BD%BD&amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;meta=">UltraEdit中</a>的&rdquo;十六进制功能&ldquo;，观察该文件的内部编码方式。</p>
<p>1）ANSI：文件的编码就是两个字节&ldquo;D1 CF&rdquo;，这正是&ldquo;严&rdquo;的GB2312编码，这也暗示GB2312是采用大头方式存储的。</p>
<p>2）Unicode：编码是四个字节&ldquo;FF FE 25 4E&rdquo;，其中&ldquo;FF FE&rdquo;表明是小头方式存储，真正的编码是4E25。</p>
<p>3）Unicode big endian：编码是四个字节&ldquo;FE FF 4E 25&rdquo;，其中&ldquo;FE FF&rdquo;表明是大头方式存储。</p>
<p>4）UTF-8：编码是六个字节&ldquo;EF BB BF E4 B8 A5&rdquo;，前三个字节&ldquo;EF BB BF&rdquo;表示这是UTF-8编码，后三个&ldquo;E4B8A5&rdquo;就是&ldquo;严&rdquo;的具体编码，它的存储顺序与编码顺序是一致的。</p>
<p><strong>9. 延伸阅读</strong></p>
<p>* <a target="_blank" href="http://www.joelonsoftware.com/articles/Unicode.html">The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets</a>（关于字符集的最基本知识）</p>
<p>* <a target="_blank" href="http://www.pconline.com.cn/pcedu/empolder/gj/other/0505/616631.html">谈谈Unicode编码</a></p>
<p>* <a target="_blank" href="http://www.ietf.org/rfc/rfc3629.txt">RFC3629：UTF-8, a transformation format of ISO 10646</a>（如果实现UTF-8的规定）</p>
<p>（完）</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.gnome.org/raywang/2008/05/07/%e5%ad%97%e7%ac%a6%e7%bc%96%e7%a0%81%e7%ac%94%e8%ae%b0%ef%bc%9aascii%ef%bc%8cunicode%e5%92%8cutf-8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>改编码</title>
		<link>http://blogs.gnome.org/raywang/2007/09/03/%e6%94%b9%e7%bc%96%e7%a0%81/</link>
		<comments>http://blogs.gnome.org/raywang/2007/09/03/%e6%94%b9%e7%bc%96%e7%a0%81/#comments</comments>
		<pubDate>Mon, 03 Sep 2007 01:35:00 +0000</pubDate>
		<dc:creator>raywang</dc:creator>
				<category><![CDATA[Encoding]]></category>

		<guid isPermaLink="false">http://raywang.yo2.cn/articles/%e6%94%b9%e7%bc%96%e7%a0%81.html</guid>
		<description><![CDATA[&#60;br&#62; <a href="http://blogs.gnome.org/raywang/2007/09/03/%e6%94%b9%e7%bc%96%e7%a0%81/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="entry">
<div class="content"> iconv 转换编码<br />
&nbsp;&nbsp;&nbsp;   自带</p>
<p>convmv 转换文件名的编码&nbsp;&nbsp;   <br />
&nbsp;&nbsp;&nbsp;   http://j3e.de/linux/convmv/</p>
<p>enca 判断文件编码  <br />
&nbsp;&nbsp;&nbsp;   http://freshmeat.net/projects/enca/  <br />
&nbsp;&nbsp;&nbsp;   http://fresh.t-systems-sfr.com/unix/src/privat2/enca-1.9.tar.gz/
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.gnome.org/raywang/2007/09/03/%e6%94%b9%e7%bc%96%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>将 locale 从 zh_CN.GB2312 转到 zh_CN.UTF-8 的一些问题和解决方法 [转]</title>
		<link>http://blogs.gnome.org/raywang/2007/06/13/%e5%b0%86-locale-%e4%bb%8e-zh_cngb2312-%e8%bd%ac%e5%88%b0-zh_cnutf-8-%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98%e5%92%8c%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95-%e8%bd%ac/</link>
		<comments>http://blogs.gnome.org/raywang/2007/06/13/%e5%b0%86-locale-%e4%bb%8e-zh_cngb2312-%e8%bd%ac%e5%88%b0-zh_cnutf-8-%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98%e5%92%8c%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95-%e8%bd%ac/#comments</comments>
		<pubDate>Wed, 13 Jun 2007 02:19:00 +0000</pubDate>
		<dc:creator>raywang</dc:creator>
				<category><![CDATA[Encoding]]></category>

		<guid isPermaLink="false">http://raywang.yo2.cn/articles/%e5%b0%86-locale-%e4%bb%8e-zh_cngb2312-%e8%bd%ac%e5%88%b0-zh_cnutf-8-%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98%e5%92%8c%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95-%e8%bd%ac.html</guid>
		<description><![CDATA[&#60;br&#62; <a href="http://blogs.gnome.org/raywang/2007/06/13/%e5%b0%86-locale-%e4%bb%8e-zh_cngb2312-%e8%bd%ac%e5%88%b0-zh_cnutf-8-%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98%e5%92%8c%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95-%e8%bd%ac/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>原文地址:http://linuxtoy.org/archives/convert-locale.html</p>
<p>一直想把自己的 Linux box 从 zh_CN.GB2312 的 locale 设置迁移到 zh_CN.UTF-8 上去，无奈之前的大量的实验中用到的文件都是 GB2312 编码的，所以，这个迁移直到最近因为要在一个工具上添加 UTF-8 编码的中文支持才得以完成。以下是我在这个迁移的过程碰到的一些和中文相关的问题以及我个人的解决方法，列此一来备忘，二来希望能给有相同需求的朋友做个 参考。</p>
<p>提醒：以下提及的工具中的大部分会对你的原始文件进行&rdquo;写&rdquo;操作，也就是说， 转换出来的结果可能会产生错误或者偏差。如果你不是一个有经验的 Linux 用户，请在做这些操作的时候，注意先做好备份。并强烈建议你在使用某一个工具之 前，先仔细阅读该工具的 manual。(&rdquo;man program-name&rdquo;)</p>
<p><strong>0、支持 Unicode 的 Terminal 工具</strong></p>
<p>我选择 Terminal 工具的<a href="http://ihome.ust.hk/blogs/home/josephwu/GNU_slash_Linux/2006/03/23/Wanted-a-terminal-emulator-substitute.html">原则</a>是：轻量（占用系统资源小）且强大。基于之前我的一个<a href="http://ihome.ust.hk/blogs/home/josephwu/GNU_slash_Linux/2006/03/24/Terminal-Emulator-Comparison.html">简单评测</a>，我现在用的 Terminal 工具是 <a href="http://software.schmorp.de/pkg/rxvt-unicode.html">rxvt-unicode</a> 加 <a href="http://www.gnu.org/software/screen/">screen</a>。xterm 对 unicode 的支持可能是最差的，除此之外，mlterm、GNOME-terminal 等工具虽然都能很好的支持 unicode，不过 mlterm 的 multi tab 功能在我更习惯于使用&rdquo;screen&rdquo;来做 multi tab 这点上显得有点多余；而 gnome-terminal 则太过于耗资源。rxvt-unicode 则刚好合我的胃口，尤其是它的 server+client 的模式可以在开启多个 Terminal 的时候节省大量的系统资源。:)</p>
<p><strong>1、文件内容的编码检测及转换</strong></p>
<p>文件内容的编码转换可以结合 2 个工具来完成。</p>
<p>a.如果你不知道你所要转换的文件的编码格式，你可以通过 <a href="http://trific.ath.cx/software/enca/">enca</a> 这个工具来检测编码。举例如下：</p>
<p><code>joseph@PeT43: ~ &gt; enca foo.txt</code></p>
<p><code>Universal transformation format 8 bits; UTF-8</code></p>
<p>b.如果你事先已经知道了文件的编码或者通过检测知道了文件的编码，可以通过 GNU 的 <a href="http://www.gnu.org/software/libiconv/">iconv</a> 来进行编码转换。以下是一个例子用来把文件的编码从 GB2312 转换成 UTF-8：</p>
<p><code>joseph@PeT43: ~ &gt; iconv -f gb2312 -t utf-8 foo.txt &gt; foot.txt.utf-8</code></p>
<p>提醒：iconv 的输出默认是直接输出到标准输出(standard output)，通常就是你的屏幕上。所以，你需要使用&rdquo;&gt;&rdquo;的重定向符号来把输出转存到一个&rdquo;新&rdquo;的文件里面去。切不可在&rdquo;&gt;&rdquo;后面使用你 的原始的输入文件名作为输出文件名，因为&rdquo;&gt;&rdquo;操作，会首先将其后面的文件清空，然后再运行 &ldquo;&gt;&rdquo;前面的操作。也就是说，除了原始的输入文件被清空之外，你什么也得不到。这是很多 Linux 新用户经常会犯的一个&rdquo;致命&rdquo;错误。特此提醒。</p>
<p><strong>2、文件名的编码转换</strong></p>
<p>上述的 2 个工具只能对文件的内容进行编码的检测和转换，如果需要对文件名进行编码转换，则需要 <a href="http://j3e.de/linux/convmv/man/">convmv</a> 来完成。convmv 的用法大致和 iconv 相似，以下是一个例子用来将&rdquo;music&rdquo;这个目录下的所有以 GB2312 编码的文件名的文件和子目录下的文件，转换成以 UTF-8 编码的文件名：</p>
<p><code>joseph@PeT43: ~ &gt; convmv -f gb2312 -t utf-8 -notest -r music</code></p>
<p>请注意这里的&rdquo;-notest&rdquo;选项：如果不提供这个选项，该命令只会做一个转换的测试，并不会真正的转换。因为这个命令有一定的&rdquo;破坏性&rdquo;，所 以，当你用这个程序的时候，最好是先不用&rdquo;-notest&rdquo;这个选项来做一遍测试，根据程序运行输出的信息来确定是否有个别的文件需要手动进行调整。</p>
<p><strong>3、MP3 的 ID3 tag 编码转换</strong></p>
<p>一个比较扰人的问题是，MP3 里面的 ID3(v1/v2) Tag 信息不能象普通的文本文件那样来用 iconv 进行编码转换。好在这个问题 <a href="http://www.cs.berkeley.edu/%7Ezf/">Feng Zhou</a> 也碰到了，他写了一个 java 的程序 <a href="http://www.cs.berkeley.edu/%7Ezf/id3iconv/">ID3iconv</a> 来处理这些 MP3 文件的 ID tag 编码转换。</p>
<p>略有不足的是，这个程序没有提供一个类似于上面提及的 convmv 的&rdquo;-r&rdquo;(recursive)的选项可以来对某一个目录下的所有文件和子目录下的文件进行递归的处理。当然，我们可以用万能的&ldquo;find&rdquo;命令来弥补 这个缺陷，以下是一个例子，用来对&rdquo;music&rdquo; 目录里面的所有 mp3 文件（含子目录下的文件）进行 ID3 tag 的转换:</p>
<p><code>joseph@PeT43: ~ &gt; find . -name '*.mp3' -exec java -jar /usr/local/bin/id3iconv-0.2.1.jar -e gb2312 '{}' \;</code></p>
<p>这个命令利用到了&rdquo;find&rdquo;命令的&rdquo;-exec&rdquo;选项来对所有找到的文件进行指定的操作，这里&ldquo;指定的操作&rdquo;就是对该文件调用 id3iconv 这个 java 的程序来进行 ID3 tag 的编码格式转换。详情请参考 find 的 manual (man find)。</p>
<p><strong>4、在 rxvt-unicode terminal 中实时改变 locale 设置</strong></p>
<p>我所碰到的一个比较扰人的问题是，虽然现在日常的操作多数是在 UTF-8 的 locale 下进行的，但是很多时候我又需要一个基于 GB2312 的 rxvt- unicode 来跑原来的一些实验。简单的在一个现有的 rxvt-unicode session 下通过&rdquo;export LC_CTYPE=zh_CN.GB2312&Prime;其实并不奏效。因为那只是告诉你的 bash 程序，此后的 locale 变成了 zh_CN.GB2312，而 rxvt-unicode 程序本身却依然工作在它启动时候的 zh_CN.UTF-8 的 locale 下。所以，即使改变了 bash 的 locale 设置，但如果在该 rxvt-unicode 中用 cat 或者 more 这样的命令来查看一个以 zh_CN.GB2312 的文件，依然看到是一堆乱码。</p>
<p>在这种情况下，一种不需要重新设置 X 系统的 locale，实时修改运行状态下的 rxvt-unicode 本身的 locale 设置的解决方案是使用 rxvt-unicode 内置的&rdquo;escape sequence&rdquo;来实现。</p>
<p>如下的 2 个命令组合，先更改 bash 的 locale 设置，然后通过&rdquo;escape sequence&rdquo;通知 rxvt-unicode 程序，现在这个 session 的 locale 设置已经被改成了 zh_CN.GB2312：</p>
<p><code>joseph@PeT43: ~ &gt; export LC_CTYPE=zh_CN.gb2312; printf &quot;\33]701;$LC_CTYPE07&quot;</code></p>
<p>这样，你就实时的得到一个 zh_CN.GB2312 的环境，可以对 zh_CN.GB2312 的文件进行正确的显式和操作了。</p>
<p>如果需要转回到 zh_CN.UTF-8 的模式，则可以通过如下的命令来实现：</p>
<p><code>joseph@PeT43: ~ &gt; export LC_CTYPE=zh_CN.utf8; printf &quot;\33]701;$LC_CTYPE07&quot;</code></p>
<p>当然，每次敲这么长的命令挺烦人的，我用的方法是把上面的这 2 个命令集合分别存成 .bash.gb 和 .bash.utf-8  两个文件，放到我的 home 目录。</p>
<p>如果我需要实时得到一个 GB2312 的 rxvt-unicode session，我就运行：</p>
<p><code>joseph@PeT43:  somewhere &gt; source ~/.bash.gb</code></p>
<p>如果我需要实时得到一个 UTF-8 的 rxvt-unicode session，我就运行：</p>
<p><code>joseph@PeT43: somewhere &gt; source  ~/.bash.utf-8</code></p>
<p>这样就省却了很多敲键盘或者 copy/paste 的时间。:)</p>
<p>这个方法是从 <a href="http://software.schmorp.de/pkg/rxvt-unicode.html">rxvt-unicode</a> 的 <a href="http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.html">FAQ</a> 中学来的。这个&rdquo;701&Prime;的 escape sequence 是 rxvt-unicode 对 xterm 的 escape sequence 的扩展，只在 rxvt-unicode 中有效。</p>
<p>[在 GNOME Terminal 里面可以通过菜单里面的&rdquo;Terminal|Set Character Encoding&rdquo;来实时更改 locale。]</p>
<p><strong>5、VIM 配置文件的更新</strong></p>
<p>我是一个 VIMmer，以下是一些我在 UTF-8 环境下的 vim 的配置：</p>
<p><code>set encoding=utf-8 &quot; set default encoding as UTF-8</code></p>
<p><code>set fileencodings=ucs-bom,utf-8,cp936,latin1 &quot; fileconding detection order</code></p>
<p><code>set termencoding=utf-8 &quot; support Chinese display in rxvt-unicode</code></p>
<p><strong>6、Misc</strong></p>
<p>以下是一些小技巧，简单罗列在下面。</p>
<p>a. 在做编码转换的时候，如果你的源格式设定为 GB2312 的话，而且在转换成 UTF-8 的时候，发现程序会报&ldquo;illegal input sequence at position xxxx&rdquo;的错误。这是由于你之前的做的假定有问题。<a href="http://zh.wikipedia.org/wiki/GB_2312">GB2312</a> 是国标里面一个最小也是最早的中文编码标准。其中，只涵盖了 6,763 个汉字。所以你需要转换的文件的原始的格式可能并不是 GB2312 编码。这个时候，你可以用 GB18030 做为源格式来进行转换。<a href="http://zh.wikipedia.org/wiki/GB_18030">GB18030</a> 是最新的国家标准，包含了 27,564 个汉字，而且向下兼容 GB2312 和 GBK。</p>
<p>b.另外，支持 Unicode 且 Free 的中文字库我推荐使用&rdquo;<a href="http://wqy.sourceforge.net/cgi-bin/index.cgi">文泉驿</a>&ldquo;。这好像也是目前为止，唯一的一个以支持 Unicode 为出发点的 Free 的中文字库。</p>
<p><strong>7、一些有用的参考：</strong></p>
<p>a. <a href="http://www.cl.cam.ac.uk/%7Emgk25/">Markus Kuhn</a> 的&rdquo;<a href="http://www.cl.cam.ac.uk/%7Emgk25/unicode.html">UTF-8 and Unicode FAQ for Unix/Linux</a>&ldquo;。最为详尽的 FAQ。</p>
<p>b. <a href="http://www.unicode.org/">Unicode Home Page</a>。Unicode 的官方网站。</p>
<p>c. <a href="http://eyegene.ophthy.med.umich.edu/unicode/">A Quick Primer On Unicode and Software Internationalization Under Linux and UNIX</a>。 <a href="mailto:ehtrager@umich.edu">Ed Trager</a> 提供的一个关于如何在 Linux 下使用 Unicode 的 tutorial，涵盖了一些我没有提及的内容。推荐阅读。</p>
<p>[撰文/<a href="http://ihome.ust.hk/blogs/home/josephwu/">Zhaojun</a>] </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.gnome.org/raywang/2007/06/13/%e5%b0%86-locale-%e4%bb%8e-zh_cngb2312-%e8%bd%ac%e5%88%b0-zh_cnutf-8-%e7%9a%84%e4%b8%80%e4%ba%9b%e9%97%ae%e9%a2%98%e5%92%8c%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95-%e8%bd%ac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  blogs.gnome.org/raywang/category/encoding/feed/ ) in 1.42339 seconds, on Feb 11th, 2012 at 10:28 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 11th, 2012 at 11:28 pm UTC -->
