宽字符支持(linux,MinGW,Qt)

1。要使用宽字符支持,使用w开头的一系列东西,如wstring,wofstream等。在使用wstring的时候,常量字符串前面要加上L,这样才能转换成wchar_t型的

else if(fileName.substr(fileName.rfind(L"."))==L".prj")

 

2。一个文件流(无论是ofstream还是wofstream),只支持const char*作为文件名,对于宽字符的wstring的文件名,该做一些处理。

 DTchar mbsFileName[512];
 DTint mbsSize=std::wcstombs(mbsFileName,m_dumpFileName.c_str(),m_dumpFileName.size()*sizeof(wchar_t));
 mbsFileName[mbsSize]=0;

 m_pDumpStream=new std::fstream(mbsFileName,std::ios::out|std::ios::binary);

上面的代码要注意的是,wcstombs转换后的char序列并没有0字符串结尾符,所以拿出去直接当字符串使用会出错。

或者“You can use wcstombs() to narrow the filename or if you're feeling adventurous, the narrow() member function of the ctype facet of a std::locale.”

http://www.gamedev.net/community/forums/topic.asp?topic_id=358254&whichpage=1?

3。MinGW不支持wchar_t,好像是因为linux下的wchar_t是4字节的,而windows下vc运行时的wchar_t是2字节的。

见Qt中qstring.cpp中的一段doxygen注释

#ifndef QT_NO_STL
/*! fn QString QString::fromStdWString(const std::wstring &str)

    Returns a copy of a str. a str is assumed to be encoded in
    utf16 if the size of wchar_t is 2 bytes (e.g. on windows) and ucs4
    if the size of wchar_t is 4 bytes (most Unix systems).

    This constructor is only available if Qt is configured with STL
    compabitility enabled.

    sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8()
*/

见MinGW的官方声明:http://www.mingw.org/MinGWiki/index.php/wide%20characters

其中还有2个连接。

另外:一个hp的家伙hack的方法:

http://lists.zerezo.com/mingw-users/msg00753.html

很复杂,我又不懂,唉。。。。绝望。

在linux下的支持宽字符的,没法在windows下移植了。。。。。。。。。。

4.MinGW下的Qt是支持宽字符的,我还测试了一下,如果文件路径中含有“桌面”二字,我的非宽字符支持的程序会runtime error(有的汉字可以包含),而Qt自带的范例程序正常。看了一下QString的源代码,如下的一段。

#ifndef QT_NO_STL_WCHAR
// workaround for some headers not typedef'ing std::wstring
typedef std::basic_string QStdWString;
#endif // QT_NO_STL_WCHAR

5. 受Qt的启发,打算照它的样子,自己在程序中支持wchar_t,不知道可不可能?????

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值