在powerpc上安装好ubuntu之后,也发现了一些问题,最主要的一个问题是:系统缺省安装了zh_CN.UTF-8作为locale,并且无法改变(应该是我没有找到办法吧?不过这一点上debian做得很好啊,用base-config就可以改变locale,很方便。在ubuntu中是使用dpkg-reconfigure
localeconf,结果只能选择语言,不能选择编码)。不过也正好,可以试一试我的wxWidgets项目的UNICODE版本了。直接编译wx库,再编译相关的项目,运行,当然出错了,乱码!原因是代码中使用的字符串编码不正确。经过仔细阅读文档中的相关内容,终于排除了这个错误,相关资料记录如下。
i18n的程序的处理包括以下几个步骤:
1. 通过wxGetTranslation()或者_()处理程序中的文本;
2.
通过xgettext程序提取源码中的需要翻译的文本,xgettext能自动识别wxGetTranslation()和_()两种类型的字符串,也可以自动提取全部的字符串,但这不是很有必要;
3.
将已经保存在.po文件中的字符串翻译成其他所需的语言;
4. 将.po文件用msgfmt工具编译成二进制的.mo文件;
5.
在程序中设定相应的locale以启用相应语言的字符串。
进行字符串编码转换主要使用wxMBConv类及其派生子类,包括:wxMBConvUTF7,wxmBConvUTF8,wxCSConv,wxMBConvUTF16,wxMBConvUTF32等。
wxMBConv中的MB2WC和WC2MB两个函数是纯虚函数,所以要求子类必须实现该函数,同时,不允许创建wxMBConv类的实例。注意以下函数的定义和使用:
size_t MB2WC( wchar_t * outbuf, const char * inbuf, size_t outsize )
const;
将inbuf中的多字节编码字符串转换成wchar_t类型的UNICODE字符串并保存到outbuf中,输出缓冲区outbuf的大小为outsize,函数返回转换之后的字符串的长度。如果输出缓冲outbuf为NULL,则只是返回转换结果的长度。
size_t WX2MB( char * outbuf, const wchar_t * inbuf, size_t outsize )
const;
此函数类似于MB2WC,将wchar_t类型的UNICODE字符串转换为多字节编码类型的字符串。
const wxWCharBuffer cMB2WC( const char * psz ) const;
从多字节字符串到UNICODE字符串的转换。
const wxCharBuffer cWC2MB( const wchar_t * psz ) const;
从UNICODE字符串到多字节字符串的转换。
const char * cMB2WX( const char * psz ) const; // ANSI
const wxWCharBuffer cMB2WX( const char * psz ) const; // UNICODE
将多字节编码字符串转换成系统当前编码类型的字符串。ANSI版本中,直接返回输入参数,什么也没有做。UNICODE版本中,通过cMB2WC()函数进行编码转换。
const char * cWX2MB( const wxChar * psz ) const; // ANSI
const wxCharBuffer cWX2MB( const wxChar * psz ) const; // UNICODE
将系统当前编码类型的字符串转换成多字节编码字符串。ANSI版本中,直接返回输入参数,什么也没有做。UNICODE版本中,通过cWC2MB()函数进行编码转换。
const wchar_t * cWC2WX( const wchar_t * psz ) const; // UNICODE
const wxCharBuffer cWC2WX( const char_t * psz ) const; // ANSI
将UNICODE编码的字符串转换成系统当前编码类型的字符串。ANSI版本中,通过函数cWC2MB()进行编码转换。UNICODE版本中,直接返回输入参数,什么也没有做。
const wchar_t * cWX2WC( const wxChar * psz ) const; //
const wxWCharBuffer cWX2WC( const wxChar * psz ) const; //
将系统当前编码类型的字符串转换成UNICODE编码的字符串。ANSI版本中,通过函数cMB2WC()进行编码转换。UNICODE版本中,直接返回输入参数,什么也没有做。
根据以上知识,自己定义的stl版本的ANSI字符串类型string和wxWidgets的wxString字符串类型的转换函数定义、实现如下:
inline string wxString2string( IN const wxString& src )
{
wxCSConv cvGB2312( wxT("GB2312") );
return string( cvGB2312.cWX2MB( src.c_str() ) );
inlinewxStringstring2wxString( IN const string& src )
{
wxCSConv cvGB2312( wxT("GB2312") );
returnwxString( cvGB2312.cMB2WX( src.c_str() ) );
已经在多个平台测试成功。