﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-再别流年的技术实验室-随笔分类-跨平台与GNU</title><link>http://www.cppblog.com/lf426/category/6551.html</link><description>Game Design Using C++ and SDL</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 18:28:47 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 18:28:47 GMT</pubDate><ttl>60</ttl><item><title>SDL在win32与Linux下的一些差别</title><link>http://www.cppblog.com/lf426/archive/2008/05/12/49594.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sun, 11 May 2008 17:55:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/05/12/49594.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/49594.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/05/12/49594.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/49594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/49594.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近在学习Linux，主要考虑到跨平台开发。我一直都在思考关于中文输入的问题，在win32下解决起来那么麻烦，难道SDL的作者会不解决吗──如果是bug的话。事实证明，在Linux平台下，我们自己把GB2312往Unicode转换的工作就多余了。当前Linux内部用的就是UTF-8（我的系统是Debian 4.0），SDL的TTF函数完全可以正常工作。不过，在Linux下面也会有些问题，现在发现的有这些，大家有发现的继续帮我补充哈。<br><br>1、在Linux下，<a href="http://www.libsdl.org/cgi/docwiki.cgi/SDL_ttf/Functions/Render/TTF_RenderText_Blended">TTF_RenderUTF8_Blended</a> 是可以正常渲染简体中文的。但是不知道为什么，Solid的渲染会报错，共享（动态链接）库的问题。<br>2、在Linux下，mid文件用SDL_mixer是打不开的。至少我的情况是这样，我装了ALSA的声卡驱动，不知道还需要做些什么才能放midi。<br>3、直接装了ALSA的驱动播放SDL_mixer是有噪音的。解决方法，也是打开Linux下软件混音(ESD)的方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 混音可以让两种音乐同时播放，首先需要安装libesd-alsa0，用Synaptic或sudo apt-get install等方式都可以进行安装，它就在Ubuntu官方软件库中。然后，用sudo gedit或您喜欢的文本编辑器创建文件<br>/etc/asound.conf
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">pcm.card0&nbsp;{<br>&nbsp;&nbsp;type&nbsp;hw<br>&nbsp;&nbsp;card&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br>}<br><br>pcm.</span><span style="color: #000000;">!</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;type&nbsp;plug<br>&nbsp;&nbsp;slave.pcm&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">dmixer</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>}<br><br>pcm.dmixer&nbsp;{<br>&nbsp;&nbsp;type&nbsp;dmix<br>&nbsp;&nbsp;ipc_key&nbsp;</span><span style="color: #000000;">1025</span><span style="color: #000000;"><br>&nbsp;&nbsp;slave&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;pcm&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hw:0,0</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;period_time&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;period_size&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;buffer_size&nbsp;</span><span style="color: #000000;">4096</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;periods&nbsp;</span><span style="color: #000000;">128</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;rate&nbsp;</span><span style="color: #000000;">44100</span><span style="color: #000000;"><br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;bindings&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;}<br>}</span></div>
接下来，运行"sudo gedit /etc/esound/esd.conf"，将文件改成下面的内容：
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">auto_spawn</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>spawn_options</span><span style="color: #000000;">=-</span><span style="color: #000000;">terminate&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">nobeeps&nbsp;</span><span style="color: #000000;">-</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;"><br>spawn_wait_ms</span><span style="color: #000000;">=</span><span style="color: #000000;">100</span><span style="color: #000000;"><br>#&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&nbsp;options&nbsp;are&nbsp;used&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;spawned&nbsp;and&nbsp;non</span><span style="color: #000000;">-</span><span style="color: #000000;">spawned&nbsp;mode<br>default_options</span><span style="color: #000000;">=</span><span style="color: #000000;"> <br></span></div>
属实挺麻烦的:)<br><img src ="http://www.cppblog.com/lf426/aggbug/49594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-05-12 01:55 <a href="http://www.cppblog.com/lf426/archive/2008/05/12/49594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SDL入门教程（十）：4、用iconv获得正确的Unicode，使用FriBiDi实现UTF-8到Unicode的正确转换</title><link>http://www.cppblog.com/lf426/archive/2008/03/31/45796.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Mon, 31 Mar 2008 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/03/31/45796.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/45796.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/03/31/45796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/45796.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/45796.html</trackback:ping><description><![CDATA[<p>作者：龙飞<br><br>4.1：为什么iconv不能完全正确的转换Unicode？<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我不是先知，教程里面是整理过的思路和逻辑顺序，在我研究这个问题的时候，头绪远远比教程里面乱得多。我完全是从Wesnoth的源代码去分析问题的，所以，为什么会扯上UTF-8和FriBidi，那也是因为在源代码中找到了线索。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iconv不能完全正确的获得Unicode，也就是我们刚才遇到的纯汉字转换没问题，而有英文就不行了。我并不清楚这是win32下的问题，还是在Linux下也这样，我也不清楚具体的算法和问题的根本原因，我只是通过试验得到一个算是表面原因的结论：我们知道，GB2312和Unicode汉字都使用2个字节（在UTF-8中是3个字节），英文和数字等用1个字节。iconv在得到两个字节（unsigned char即一个字节大小）代码的时候可以正确的将GB2312转化为Unicode（或者UTF-8），但是只有1个字节的时候则在转化Unicode的时候终止了，幸运的是，如果是转化为UTF-8则可以正确的进行，并且也转化为1个字节的UTF-8（只限于英文，数字等）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，我们可以先通过iconv将原来的GB2312转化为UTF-8——汉字用3个字节（3个单位的unsigned char），英文、数字和基本符号用1个字节（1个单位的unsigned char）。然后，我们需要一个函数，将这种形式的UTF-8转换为SDL所需要的Uint16的Unicode。什么样的函数可以实现这种转换呢？<br><br>4.2：其它编码与Unicode之间的双向转换，GNU FriBidi<br><a href="http://fribidi.freedesktop.org/wiki/">http://fribidi.freedesktop.org/wiki/</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FriBidi是一个致力于Unicode编码与其它编码相互转换的开源项目，到目前为止，还是一个尚未完成的项目。我在研究Wesnoth源代码的时候看到这样的函数：fribidi_utf8_to_unicode()，所以，我想在这个函数中可能应该包含UTF-8到Unicode的算法——希望不要太复杂。在FriBidi项目中找到这个函数，它在文件fribidi_char_sets_utf8.c下面：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"><br>fribidi_utf8_to_unicode&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len,&nbsp;FriBidiChar&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">us)<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;warning:&nbsp;the&nbsp;length&nbsp;of&nbsp;input&nbsp;string&nbsp;may&nbsp;exceed&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;output&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;length;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">t&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s;<br><br>&nbsp;&nbsp;length&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(s&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;len)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;s&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x7f</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;one&nbsp;byte&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">us</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;expand&nbsp;with&nbsp;0s&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;s&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0xdf</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;2&nbsp;byte&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">us</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;s&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x1f</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;(s&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;3&nbsp;byte&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">us</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;s&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0f</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;(s&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;(s&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">us&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(length);<br>}</span></div>
其中，我们找到FriBidiChar的定义，类似Uint32的类型；另外，函数用char表示1字节的单位。根据我的试验，至少在VC2008下是有错误的，我们一直用的是unsigned char表示1字节的单位，所以，我们需要对这个函数做些修改：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;myUTF8_to_UNICODE(Uint16</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;unicode,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;utf8,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;length;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;utf8;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(utf8&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;len){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">one&nbsp;byte.ASCII&nbsp;as&nbsp;a,&nbsp;b,&nbsp;c,&nbsp;1,&nbsp;2,&nbsp;3<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;ect</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;utf8&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x7f</span><span style="COLOR: #000000">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">expand&nbsp;with&nbsp;0s.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">unicode</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">utf8</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">2&nbsp;byte.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;utf8&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0xdf</span><span style="COLOR: #000000">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">unicode</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;utf8&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x1f</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;(utf8&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utf8&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">3&nbsp;byte.Chinese&nbsp;may&nbsp;use&nbsp;3&nbsp;byte.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">unicode</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;utf8&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0f</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;(utf8&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;(utf8&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utf8&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">unicode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(length);<br>}</span></div>
<br>4.3：将汉字，英文，数字和符号都正确的转换为16位的Unicode<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了iconv和上面这个函数，我们终于可以将GB2312的编码正确的转换为Unicode了。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">FileName:&nbsp;gb2312_to_Unicode.h</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">#ifndef&nbsp;GB2312_TO_UNICODE_H_<br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;GB2312_TO_UNICODE_H_</span><span style="COLOR: #000000"><br><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GNU/iconv.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SDL/SDL.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br>std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Uint16</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;getUnicode(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;str);<br><br></span><span style="COLOR: #0000ff">#endif</span></div>
实现文件中包含我们上面写的从UTF-8到Unicode的函数：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">gb2312_to_Unicode.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;myUTF8_to_UNICODE(Uint16</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;unicode,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;utf8,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len);<br><br>std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Uint16</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;getUnicode(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;str)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;CHAR_SIZE&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">GB2312&nbsp;src</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;src&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(str.c_str());<br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;src_len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen((</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)src);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Unicode&nbsp;dst&nbsp;to&nbsp;get</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;dst[CHAR_SIZE]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;dst_len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(dst);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">iconv&nbsp;arg</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;src;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dst;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;iconv_t&nbsp;cd;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">GB2312&nbsp;to&nbsp;UTF-8</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iconv_open(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GB2312</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((iconv_t)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;cd){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">conversion</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;iconv(cd,&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">src_len,&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dst_len);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">UTF-8&nbsp;to&nbsp;Unicode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;utf8Len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen((</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)dst);<br>&nbsp;&nbsp;&nbsp;&nbsp;Uint16&nbsp;unicodeData[CHAR_SIZE]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;unicodeLen&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myUTF8_to_UNICODE(unicodeData,&nbsp;dst,&nbsp;utf8Len);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Uint16</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;unicodeVectorArray;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;unicodeLen;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unicodeVectorArray.push_back(unicodeData[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(cd);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;unicodeVectorArray;<br>}</span></div>
函数把一个std::string转换位Uint16的vector数组并返回，这正是SDL所需要的Unicode格式。
<img src ="http://www.cppblog.com/lf426/aggbug/45796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-03-31 11:00 <a href="http://www.cppblog.com/lf426/archive/2008/03/31/45796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SDL入门教程（十）：3、字符集之间的转换，win32下的libiconv</title><link>http://www.cppblog.com/lf426/archive/2008/03/30/45738.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sun, 30 Mar 2008 04:45:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/03/30/45738.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/45738.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/03/30/45738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/45738.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/45738.html</trackback:ping><description><![CDATA[作者：龙飞<br><br>3.1：GNU的libiconv项目<br><a href="http://www.gnu.org/software/libiconv/">http://www.gnu.org/software/libiconv/</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再一次的，感谢伟大的GNU。我们需要的是Unicode码，在程序中转换，我们需要相应的库。libiconv支持许多字符集，包括我们将用到的GB2312，UTF-8和UCS-2（Unicode）。具体的，在项目主页上有详细的说明。我们需要新学习直接用的类容并不繁多，同样的，如果你没什么兴趣自己编译源代码，可以直接用在win32下编译好的头文件，库和动态链接库（DLL）。win32下的项目主页是：<br><a href="http://gettext.sourceforge.net/">http://gettext.sourceforge.net/</a><br>有趣的是，作者把它作为了我们前面提到的gettext的一部分。在下载页面上，我们直接选择<a title=libiconv-win32 href="http://sourceforge.net/project/showfiles.php?group_id=25167&amp;package_id=51458">libiconv-win32</a>，同样的，我直接给出所需要的三部分文件的相关信息：<br>iconv.h：头文件，请在C++代码中#include进来；<br>iconv.lib：库文件，在编译时候使用；<br>iconv.dll：动态链接库，请放到exe文件能找到的路径下（通常与exe在同一文件夹下面）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面，我们看看libiconv的使用方法。<br><br>3.2：libiconv的演示程序<br>我们还是边写程序边做说明：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iomanip</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GNU/iconv.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;showHex(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x);</span></div>
&lt;iomanip&gt;和showHex函数，是用来现实16进制的。我们在前面用过。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">src&nbsp;string</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;str&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">你好</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string&nbsp;size</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;STR_SIZE&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string&nbsp;to&nbsp;be&nbsp;changed</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;src&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(str.c_str());<br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;src_len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen((</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)src);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string&nbsp;after&nbsp;changed</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;dst[STR_SIZE]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;dst_len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(dst);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">iconv's&nbsp;arg</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;src;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dst;<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;src&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;</span></div>
我们用来转换的字符串是&#8220;纯中文&#8221;（为什么我要加引号重点说明，后面会有原因的解释）"你好"。STR_SIZE是预留的转换内存空间。为什么不用动态存储呢？因为我试过，有错误，可能是iconv自身的限制。src是C风格的源字符串，dst是转换后的unsigned char数组。in和out是用于inconv的参数。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">GB2312&nbsp;to&nbsp;UCS-2&nbsp;(Unicode)</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;iconv_t&nbsp;cd;<br>&nbsp;&nbsp;&nbsp;&nbsp;cd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iconv_open(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UCS-2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GB2312</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((iconv_t)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;cd){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;iconv(cd,&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">src_len,&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dst_len);<br>&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(cd);&nbsp;</span></div>
这一段是编码的转换，详细内容请查阅iconv的doc。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Unicode&nbsp;dst</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dst:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;unicode_len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen((</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)dst);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;unicode_len;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showHex(dst[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;showHex(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;hex;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0x</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;setw(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;setfill(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;dec;<br>}</span></div>
最后一部分是显示转换后代码。包括函数showHex()。<br><br>3.3：iconv的问题。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们似乎已经解决问题了。但是有一个问题是，这样转换的编码是8位的，即unsigned char，而SDL需要的是16位的，即Uint16；第二个问题是，我说了，这是纯中文，你试试在&#8220;你&#8221;和&#8220;好&#8221;之间加段英语是什么效果？结论是，转换不能正常进行，在遇到第一个非汉字的时候，就终止了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题还是没解决，研究还得继续。
<img src ="http://www.cppblog.com/lf426/aggbug/45738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-03-30 12:45 <a href="http://www.cppblog.com/lf426/archive/2008/03/30/45738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SDL入门教程（十）：1、多语言支持，Win32下的GetText</title><link>http://www.cppblog.com/lf426/archive/2008/03/30/45723.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sat, 29 Mar 2008 18:02:00 GMT</pubDate><guid>http://www.cppblog.com/lf426/archive/2008/03/30/45723.html</guid><wfw:comment>http://www.cppblog.com/lf426/comments/45723.html</wfw:comment><comments>http://www.cppblog.com/lf426/archive/2008/03/30/45723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lf426/comments/commentRss/45723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lf426/services/trackbacks/45723.html</trackback:ping><description><![CDATA[<p>作者：龙飞<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自从开始研究SDL的文本显示，我就一直在思考在SDL中显示中文的问题。我们知道<a title=韦诺之战 href="http://www.wesnoth.cn/">韦诺之战</a>（<a title="Battle for Wesnoth" href="http://www.wesnoth.org/">Battle for Wesnoth</a>）使用SDL开发的，并且支持多语言。所以，我一直相信Wesnoth的源代码里面一定有我所需要的答案。网络上是纵说纷纭啊，有些人干脆说，SDL不支持中文；有些人在困难面前回到了MFC的怀抱。而，既然我的目标是跨平台，并且我也相信一定能找到答案，所以，我坚持寻找。终于，完美解决了在SDL中显示中文，甚至多语言的问题。以下的几节，我将全面，详细的说明这些方法。<br><br>1.1：po，mo与gettext<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线索从Wesnoth的发布游戏与源代码中开始，我们知道，在Wesnoth游戏中，有个名为po的文件夹，多国语言翻译都放在了这个文件夹下面。游戏程序中多为*.mo文件，源代码中多为*.po文件。通过搜索，po与mo的背景浮出水面——它们来自GNU项目<a title=gettext href="http://www.gnu.org/software/gettext/gettext.html">gettext</a>。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gettext项目是专门为多语言设计的。我们不需要修改源代码和程序的情况下，可以让程序支持多国语言。程序将根据系统所在的国家和区域选择相应的语言，当然，也可以在执行过程中让玩家自由的选择。既然是开放源代码的，自然也很容易的被移植到win32下。win32下的这个项目主页如下：<br><a href="http://gnuwin32.sourceforge.net/packages/gettext.htm">http://gnuwin32.sourceforge.net/packages/gettext.htm</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了方便的使用，我还是建议你下载完整的安装包（Complete package）。然后，你可以看英文说明，也可以凭着直觉去试验，找到哪些库和哪些DLL文件是编译和运行时必须的——当然，我也可以直接告诉你答案。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置编译环境的问题就不再多说了，不清楚的请看前面的章节。反正都三部分：*.h文件，*.lib文件和*.dll文件，放到相应的文件夹下面并在编译时候指明就可以了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们下面将用到的文件有：<br>libintl.h：请在写源代码的时候#include进来；<br>libintl.lib：这是编译时候需要的库文件；<br>libintl3.dll和libiconv2.dll：这是程序运行时候需要的文件，放到*.exe文件可以找到的地方。<br><br>1.2：演示程序以及说明</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">clocale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GNU/libintl.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bindtextdomain(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myText</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">E:/My&nbsp;Documents/Visual&nbsp;Studio&nbsp;2008/po</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;textdomain(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myText</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;test&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;gettext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;World!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;test&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们先说#include进来的&lt;clocale&gt;，我用&#8220;&lt;&gt;&#8221;表示它是标准C++的一部分。它包含了函数setlocale()。这个函数在这里的两个参数——常量LC_ALL与空字符串""的意思是，在这个程序中的所有语言与区域，都设置为系统默认的语言与区域。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libintl.h是我们刚才加入的GNU的一部分，这意味着在Linux系统下，这个头文件是系统本身自带的。它包含了后面三个函数：bindtextdomain()将一个文件夹目录绑定到一个域名上，这个域名也是将来*.mo文件的文件名；textdomain()表明我们将使用的域名；gettext()中的字符串将是被多语言翻译替换的部分。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将这个程序编译，在没有多语言包的时候，程序也能正常的运行，显示&#8220;Hello, World!&#8221;。<br><br>1.3：为源程序制作po文件和mo文件<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你已经安装了完整的安装包，找到相关文件夹的bin目录，这里有很多工具软件。你可以通过cmd的方式一步步的转换，也可以，偷点儿懒，因为有更加现成的工具可以用。但是，第一步，从源代码提取gettext()的文本，还得靠命令：xgettext。就跟用g++命令一样，假设我们的源文件名是main.cpp，我们把它先转换成一个模板文件a.pot：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">xgettext&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">o&nbsp;a.pot&nbsp;main.cpp</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以用vim之类的文本编辑器看看*.pot文件的内容，你会发现，一些说明，以及提取文本的详细信息被纪录了下来。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#&nbsp;SOME&nbsp;DESCRIPTIVE&nbsp;TITLE.<br>#&nbsp;Copyright&nbsp;(C)&nbsp;YEAR&nbsp;THE&nbsp;PACKAGE</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">S&nbsp;COPYRIGHT&nbsp;HOLDER</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">#&nbsp;This&nbsp;file&nbsp;</span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000">&nbsp;distributed&nbsp;under&nbsp;the&nbsp;same&nbsp;license&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;the&nbsp;PACKAGE&nbsp;package.<br>#&nbsp;FIRST&nbsp;AUTHOR&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">EMAIL@ADDRESS</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">,&nbsp;YEAR.<br>#<br>#,&nbsp;fuzzy<br>msgid&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"><br>msgstr&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Project-Id-Version:&nbsp;PACKAGE&nbsp;VERSION\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Report-Msgid-Bugs-To:&nbsp;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">POT-Creation-Date:&nbsp;2008-03-30&nbsp;00:24+0800\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">PO-Revision-Date:&nbsp;YEAR-MO-DA&nbsp;HO:MI+ZONE\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Last-Translator:&nbsp;FULL&nbsp;NAME&nbsp;&lt;EMAIL@ADDRESS&gt;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Language-Team:&nbsp;LANGUAGE&nbsp;&lt;LL@li.org&gt;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MIME-Version:&nbsp;1.0\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Type:&nbsp;text/plain;&nbsp;charset=CHARSET\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Transfer-Encoding:&nbsp;8bit\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br>#:&nbsp;main.cpp:</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000"><br>msgid&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;World!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>msgstr&nbsp;</span><span style="COLOR: #000000">""</span></div>
下面，我们使用一个简单的小工具poedit。又一个跨平台的软件，主页在：<br><a href="http://www.poedit.net/">http://www.poedit.net/</a><br>安装运行后，选择&#8220;从POT文件更新类目&#8221;，然后打开我们刚才的a.pot，什么都不用修改（当然，你也可以把自己信息都写上去），确保&#8220;字符集&#8221;是UTF-8就可以了。然后，在英语下面也上替换的文字吧，保存的时候，相应的mo文件也就建立起来了。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">msgid&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"><br>msgstr&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Project-Id-Version:&nbsp;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Report-Msgid-Bugs-To:&nbsp;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">POT-Creation-Date:&nbsp;2008-03-30&nbsp;00:24+0800\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">PO-Revision-Date:&nbsp;2008-03-30&nbsp;00:25+0800\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Last-Translator:&nbsp;lf426&nbsp;&lt;zbln426@163.com&gt;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Language-Team:&nbsp;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MIME-Version:&nbsp;1.0\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Type:&nbsp;text/plain;&nbsp;charset=UTF-8\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Transfer-Encoding:&nbsp;8bit\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br>#:&nbsp;main.cpp:</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000"><br>msgid&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;World!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>msgstr&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">浜茬埍鐨勪笘鐣岋紝鎴戞潵浜嗭紒</span><span style="COLOR: #000000">"</span></div>
这是po文件。怎么是乱码？那是因为windows不是用UTF-8保存的文本文件（默认一般是GB2312）。用poedit打开时候是正确显示的。我的文本内容是：&#8220;亲爱的世界，我来了！&#8221;。<br>如果你用的是vim，可以通过设置环境变量解决显示乱码的问题，在_vimrc文件中添加这一句：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&nbsp;fileencodings</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">gb2312,ucs</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">bom,utf</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,chinese</span></div>
<br><br>1.4：设置mo文件的目录<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的工作可能就有些教条了。还记得我们绑定域名的路径吧，我用的是<br>E:\My Documents\Visual Studio 2008\po<br>（请注意在C++程序里面把斜杠反过来！）<br>*.mo文件并不是直接放到这个路径下，而是这个路径下的./LL/LC_MESSAGES或者./LL_CC/LC_MESSAGES。其中LL表示语种，CC表示国家或区域。具体的请参考Wesnoth。就我们的中文来说，这个例子放mo文件的路径是：<br>E:\My Documents\Visual Studio 2008\po\zh_CN\LC_MESSAGES<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在运行程序就可以看到文本已经被替换了。如果我们删除mo文件或修改mo文件名（与绑定域名不一致），程序会继续显示原来的英文。如果我们改变系统环境，只要不是中国中文，程序都还是显示英文。如果我们要更新替换内容，直接用poedit更新po和mo文件就可以了。<br>&nbsp;<br>1.5：构建StringData类<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们希望字符串的数据单独的保存在一个文件里，这样既方便被gettext提取，也方便修改。而且，在程序里面，我们尽量把gettext涉及到的一些特殊的设置隐藏了。所以，我们构建StringDada类，在程序中需要用到的地方，直接调用它的对象就可以了。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">FileName:&nbsp;string_data.h</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">#ifndef&nbsp;STRING_DATA_H<br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;STRING_DATA_H</span><span style="COLOR: #000000"><br><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">clocale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GNU/libintl.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;StringData<br>{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;data;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;StringData();<br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;[](</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;n)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br>};<br><br></span><span style="COLOR: #0000ff">#endif</span></div>
我重载了[]，这样在调用数据的时候更加直观。我们将数据都写在StringData的构造函数中，将来gettext也只需要提取StringData的实现文件就可以了。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#<span style="COLOR: #0000ff">include&nbsp;</span></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">string_data.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br>StringData::StringData()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bindtextdomain(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">StringData</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">./po</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;textdomain(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">StringData</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(gettext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Up&nbsp;was&nbsp;pressed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(gettext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Down&nbsp;was&nbsp;pressed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">2</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(gettext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Left&nbsp;was&nbsp;pressed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">3</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(gettext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Right&nbsp;was&nbsp;pressed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">4</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(gettext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Other&nbsp;key&nbsp;was&nbsp;pressed.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>}<br><br>std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;StringData::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;[](</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;n)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;n&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;data.size()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">&nbsp;return</span> 0;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;data[n];<br>}</span></div>
<p><br>1.6：做个gettext的批处理<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你按照我全面介绍的，安装了Poedit，也安装了GnuWin32，那么，我们做个批处理文件让从string_data.cpp到StringData.mo的转换更加简单吧。（如果安装路径不一样请做相应的修改）。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">@set&nbsp;path</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">C:\Program&nbsp;Files\GnuWin32\bin;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">PATH</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">;<br>xgettext&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">force</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">po&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">o&nbsp;string_data.pot&nbsp;string_data.cpp<br>msginit&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l&nbsp;zh_CN&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">o&nbsp;StringData.po&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i&nbsp;string_data.pot<br>@set&nbsp;path</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">C:\Program&nbsp;Files\Poedit\bin;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">PATH</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">;&nbsp;<br>poedit&nbsp;StringData.po<br>del&nbsp;string_data.pot<br>del&nbsp;StringData.po</span></div>
Poedit打开StringData.po的时候会报错，那是因为文件指明的编码不可用，请在&#8220;字符集&#8221;中选择UTF-8，另外，在&#8220;工程名称以及版本&#8221;中写点信息，不要使用默认值就可以了。然后翻译并保存，StringData.mo文件就生成了。 
<img src ="http://www.cppblog.com/lf426/aggbug/45723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lf426/" target="_blank">lf426</a> 2008-03-30 02:02 <a href="http://www.cppblog.com/lf426/archive/2008/03/30/45723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>