wxString字符串编码转换

在powerpc上安装好ubuntu之后,也发现了一些问题,最主要的一个问题是:系统缺省安装了zh_CN.UTF-8作为locale,并且无法改变(应­该是我没有找到办法吧?不过这一点上debian做得很好啊,用base-config就可以改变locale,很方便。在ubuntu中是使用dpkg-re­configure无线空间 F ? w.l/l p
localeconf,结果只能选择语言,不能选择编码)。不过也正好,可以试一试我的wxWidgets项目的UNICODE版本了。直接编译wx库,再编译­相关的项目,运行,当然出错了,乱码!原因是代码中使用的字符串编码不正确。经过仔细阅读文档中的相关内容,终于排除了这个错误,相关资料记录如下。无线空间3N6I m:M$r p

i18n的程序的处理包括以下几个步骤:无线空间7s Y N l*l W0? ~$~*B
1. 通过wxGetTranslation()或者_()处理程序中的文本;无线空间 e ] d$C5? L |
2.无线空间 G+v3E K ['w
通过xgettext程序提取源码中的需要翻译的文本,xgettext能自动识别wxGetTranslation()和_()两种类型的字符串,也可以自动­提取全部的字符串,但这不是很有必要;无线空间0a } D | i$v n.Q1B ?
3.
!e0F S3N a a9w J1A0将已经保存在.po文件中的字符串翻译成其他所需的语言;
z M P F H P04. 将.po文件用msgfmt工具编译成二进制的.mo文件;无线空间-Z i k _)b3G y l:H%T
5.无线空间0[ P(k t [ |u
在程序中设定相应的locale以启用相应语言的字符串。
H(N,N A n3J Z-Q0

进行字符串编码转换主要使用wxMBConv类及其派生子类,包括:wxMBConvUTF7,wxmBConvUTF8,wxCSConv,wxMBConv­UTF16,wxMBConvUTF32等。
l9N&j h4j w:^,a @/ e0

wxMBConv中的MB2WC和WC2MB两个函数是纯虚函数,所以要求子类必须实现该函数,同时,不允许创建wxMBConv类的实例。注意以下函数的定义­和使用:无线空间5/ X a;s)? v1O.f

size_t MB2WC( wchar_t * outbuf, const char * inbuf, size_t outsize )无线空间:`,v"[ ] ^ /
const;
S1b,E W l z0将inbuf中的多字节编码字符串转换成wchar_t类型的UNICODE字符串并保存到outbuf中,输出缓冲区outbuf的大小为outsize,函­数返回转换之后的字符串的长度。如果输出缓冲outbuf为NULL,则只是返回转换结果的长度。
$L:g b N3J0

size_t WX2MB( char * outbuf, const wchar_t * inbuf, size_t outsize )无线空间 d ` p L5C
const;无线空间*Q/? K#M*E.S s /3@ f O
此函数类似于MB2WC,将wchar_t类型的UNICODE字符串转换为多字节编码类型的字符串。
Q ? c u m,R.c P0

const wxWCharBuffer cMB2WC( const char * psz ) const;
J.a A:T"F'] v:g0从多字节字符串到UNICODE字符串的转换。无线空间 S*K+T7v } N j5O e

const wxCharBuffer cWC2MB( const wchar_t * psz ) const;
,S Z w V0g&d0从UNICODE字符串到多字节字符串的转换。无线空间y+J A"u h q C4k G"V"r

const char * cMB2WX( const char * psz ) const; // ANSI
m s p b a3C+r)|4E E0const wxWCharBuffer cMB2WX( const char * psz ) const; // UNICODE
E7L u ] P X0将多字节编码字符串转换成系统当前编码类型的字符串。ANSI版本中,直接返回输入参数,什么也没有做。UNICODE版本中,通过cMB2WC()函数进行编­码转换。
7D6F S w!u F p Y0

const char * cWX2MB( const wxChar * psz ) const; // ANSI无线空间 ` m$U:y w,h.] H t
const wxCharBuffer cWX2MB( const wxChar * psz ) const; // UNICODE无线空间 p W6M [ L }
将系统当前编码类型的字符串转换成多字节编码字符串。ANSI版本中,直接返回输入参数,什么也没有做。UNICODE版本中,通过cWC2MB()函数进行编­码转换。无线空间 n d O Y f `1e&Q

const wchar_t * cWC2WX( const wchar_t * psz ) const; // UNICODE
4y v S+L W8` i b M0const wxCharBuffer cWC2WX( const char_t * psz ) const; // ANSI无线空间 u y#t7R Rh+x0{*y
将UNICODE编码的字符串转换成系统当前编码类型的字符串。ANSI版本中,通过函数cWC2MB()进行编码转换。UNICODE版本中,直接返回输入参­数,什么也没有做。无线空间&b%}%f8p l G7b

const wchar_t * cWX2WC( const wxChar * psz ) const; //无线空间 S g-F;f g"g;i ~ L b
const wxWCharBuffer cWX2WC( const wxChar * psz ) const; //
2f D V Y f C0将系统当前编码类型的字符串转换成UNICODE编码的字符串。ANSI版本中,通过函数cMB2WC()进行编码转换。UNICODE版本中,直接返回输入参­数,什么也没有做。
W} l G L | [*c'}0

根据以上知识,自己定义的stl版本的ANSI字符串类型string和wxWidgets的wxString字符串类型的转换函数定义、实现如下:
1g u(y7s I @&z(R)_0

inline string wxString2string( IN const wxString& src )无线空间 q h5] V'q9W:l I8L,e N%g
{
!R rr o p |*p ^1B P M0 wxCSConv cvGB2312( wxT("GB2312") );
e%s ]'D#b&t7x0 return string( cvGB2312.cWX2MB( src.c_str() ) );无线空间+W L ]| v h)q V/Hn4I

 

}
9I,s-k N9] y0无线空间 L+B:t N.i

inlinewxStringstring2wxString( IN const string& src )
L S t'T"@ z l0{无线空间(X2B"S%t*s D
wxCSConv cvGB2312( wxT("GB2312") );无线空间/Q&|#A0T$@ F Q
returnwxString( cvGB2312.cMB2WX( src.c_str() ) );无线空间 S-N-E } A-C ^2O6J:X

 

}
-_9t P6To b6^ ]0
N4T$q4N t0

已经在多个平台测试成功。
g p5k&m _-a;e0

展开阅读全文

没有更多推荐了,返回首页