﻿<?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++博客-小明思考-随笔分类-Linux</title><link>http://www.cppblog.com/sandy/category/5559.html</link><description>高性能服务器端计算</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 06:52:42 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 06:52:42 GMT</pubDate><ttl>60</ttl><item><title>G11N Developement (2) --- Linux Best Practice</title><link>http://www.cppblog.com/sandy/archive/2006/06/26/9020.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 26 Jun 2006 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2006/06/26/9020.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/9020.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2006/06/26/9020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/9020.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/9020.html</trackback:ping><description><![CDATA[在linux/Unix平台上面做G11N的开发，大抵都会用到gettext库/工具集( <a href="ftp://ftp.gnu.org/gnu/gettext/" target="_top">ftp://ftp.gnu.org/gnu/gettext/</a>&nbsp;) 和libiconv(<a href="http://www.gnu.org/software/libiconv/">http://www.gnu.org/software/libiconv/</a>) ,前者是用于实现Resource bundle,而后者用于各种编码转化。<br><br>(注:这里没有考虑cross-platform)<br><br><br>1. 实现方法<br><br>a . 使用po文件作为资源文件 (建议编码是utf-8)<br>&nbsp;&nbsp;&nbsp; 一方面因为UTF-8兼容ANSI,另外一方面考虑到G11N的程序大部分使用utf-8输出，比如输出到database,web UI, file等等。<br><br>b. 使用getext从resource file ( mo文件)读到相应的L10N resource文件<br>&nbsp;&nbsp;&nbsp;注意这里需要先setlocale来设置locale<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</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;">locale.h</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;">libintl.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;_(string)&nbsp;gettext&nbsp;(string)</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;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(setlocale(LC_ALL,&nbsp;&#8220;&#8221;)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;&#8220;setlocale()&nbsp;error.\n&#8221;);<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>}<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bindtextdomain(package,&nbsp;&#8220;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">share</span><span style="color: #000000;">/</span><span style="color: #000000;">locale&#8221;)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;&#8220;bindtextdomain()&nbsp;error.\n&#8221;);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;&#8211;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(textdomain(package)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;&#8220;textdomain()&nbsp;error.\n&#8221;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;&#8211;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;</span><span style="color: #000000;">%</span><span style="color: #000000;">s\n&#8221;,&nbsp;_(&#8220;Hello,&nbsp;world</span><span style="color: #000000;">!</span><span style="color: #000000;">&#8221;));<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></span></div>
<br><br>c.如果要输出到控制台(console),因为不是console都支持unicode output，所以推荐的方法是首先是把utf-8转化为本地编码，然后使用printf输出。不推荐使用wprintf进行输出，一方面是因为wchar_t的大小随编译器不同，不好控制。另外一方面，很多wprintf的实现也都是先把wchar_t[]转为本地编码，然后输出。转化编码使用libconv<br><br>d.如果要输出到web pages,database,file，编码推荐使用utf-8.<br><br>e.如果要输出本地化的日期和时间，使用API: strftime<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</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;">time.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><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;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv)&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;t;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;tm&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ptm;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[</span><span style="color: #000000;">100</span><span style="color: #000000;">];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;memset(buffer,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buffer));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(time(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;&#8220;time()&nbsp;error:&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">m\n&#8221;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((ptm&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;localtime(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;&#8220;localtime()&nbsp;error:&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">m\n&#8221;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;strftime(buffer,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buffer),&nbsp;&#8220;</span><span style="color: #000000;">%</span><span style="color: #000000;">x&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">X&#8221;,&nbsp;ptm);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;</span><span style="color: #000000;">%</span><span style="color: #000000;">s\n&#8221;,&nbsp;buffer);<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></span></div>
<br><br>f. 如果要输出本地化的数字和货币，使用API: strfmon<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</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;">monetary.h</span><span style="color: #000000;">&gt;</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;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[</span><span style="color: #000000;">100</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;strfmon(buffer,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buffer),&nbsp;&#8220;</span><span style="color: #000000;">%=*</span><span style="color: #000000;">i</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;12345.67);</span><span style="color: #000000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;</span><span style="color: #000000;">%</span><span style="color: #000000;">s\n&#8221;,&nbsp;buffer);<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></span></div>
<br><br>2.目录结构<br>/product<br>&nbsp;&nbsp;/i18n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/zh_TW<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;your.mo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ja_JP&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;your.mo<br><br><img src ="http://www.cppblog.com/sandy/aggbug/9020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2006-06-26 16:57 <a href="http://www.cppblog.com/sandy/archive/2006/06/26/9020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++跨平台开发方法/工具</title><link>http://www.cppblog.com/sandy/archive/2006/03/24/4544.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 24 Mar 2006 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/sandy/archive/2006/03/24/4544.html</guid><wfw:comment>http://www.cppblog.com/sandy/comments/4544.html</wfw:comment><comments>http://www.cppblog.com/sandy/archive/2006/03/24/4544.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cppblog.com/sandy/comments/commentRss/4544.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sandy/services/trackbacks/4544.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 主要阐述linux/windows跨平台开发<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/sandy/archive/2006/03/24/4544.html'>阅读全文</a><img src ="http://www.cppblog.com/sandy/aggbug/4544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sandy/" target="_blank">小明</a> 2006-03-24 16:45 <a href="http://www.cppblog.com/sandy/archive/2006/03/24/4544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>