分享
 
 
 

【翻译文章】如何升级基于STL的应用来支持Unicode

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

来源:http://dozb.blogchina.com/1655050.html

翻译作者:dozb,Nicole

原作者:Taka Muraoka

原出处:http://www.codeproject.com/vcpp/stl/upgradingstlappstounicode.asp

介绍我最近升级一个想当大的程序,目的是用Unicode代替single-byte 字符。除了少数遗留下来的模块,我忠实地使用t-functions并且用_T()宏包裹我的字符串和字符常量,众所周知这能安全的转换成Unicode,我要做的事情是定义UNICODE 和 _UNICODE,我祈祷所有事情将如我所愿的工作。

天啊,我是多么地错误:((

因此,我写这篇文章是为了治疗两周工作之痛,并且希望解除其他人的痛苦,这痛苦是我已经经受的。唉...

基础理论上,写出用single- 或 double-字节字符能被编译的代码是直接的。我曾经想在这里写一节,但是Chris Maunder 已经写了 done it. 他描述的技术是广为人知的,因此对理解这篇文章的内容非常有帮助。

Wide 文件 I/O这里是stream类的wide版本,它容易地定义t-风格的宏去管理他们:

你将像这样用它们:

tofstream testFile( "test.txt" ) ;

testFile << _T("ABC") ;

现在,你期待的结果是,当用single-byte 字符编译的时候,执行代码将生成3字节的文件,当用double-byte 字符编译的时候,执行代码将生成6字节的文件。但是你错了,都是3字节的文件。

到底怎么啦?

这渊源是标准C++的规定,wide流当写到 file。必须转换double-byte 到single-byte 。如上例,宽字符串L"ABC"(有6个字节长),当写到文件前,被转换成窄字符串(3字节)。更坏的情况,如何转换由库的实现来决定的( implementation-dependent)。

我不能找出一个确切的解释,为什么事情会弄成这样子。我猜测,文件被定义为考虑作为字符(single-byte)流。若允许同时写2字节的字符将无法提取。不管对还是错,这都导致严重的问题。例如,你不能写二进制数据到wofstream,因为这个类试图在输出前先窄字符化它。

这对我是明显的问题,因为我有大量的函数像这样写:

void outputStuff( tostream& os )

{

// output stuff to the stream

os << ....

}

假如你传递的是tstringstream 对象将没有问题(例如,它流出宽字符),但是假如你传递的是tofstream 将得到怪异的结果(因为所有内容都被窄化了)。

Wide 文件 I/O: 解决方案用调试器单步跟踪STL,结果发现wofstream 在写输出到文件以前,调用std::codecvt 对象来窄化输出的数据。std::codecvt对象是造成字符串从一种字符集到另一种字符集转换的原因。C++要求作为标准提供:1、转换chars 到 chars(例如,费力地什么也不做),2、转换wchar_ts 到chars。后一种就是引起我们这么多伤心事的原因。

解决方案:写一个新的继承自codecvt的类,用来转换wchar_ts 到 wchar_ts(什么也不做),绑定到wofstream 对象中。当wofstream 试图转换它所输出的数据时,它将调用我们新的codecvt 对象,实际上什么也不做,不改变地写输出数据。

在google groups浏览找一些P. J. Plauger写的代码 code (是MSVC环境中STL库的作者),

用来解决用 Stlport 4.5.3 的编译问题。 这是最后敲定的版本:

#include

// nb: MSVC6+Stlport can't handle "std::"

// appearing in the NullCodecvtBase typedef.

using std::codecvt ;

typedef codecvt < wchar_t , char , mbstate_t > NullCodecvtBase ;

class NullCodecvt

: public NullCodecvtBase

{

public:

typedef wchar_t _E ;

typedef char _To ;

typedef mbstate_t _St ;

explicit NullCodecvt( size_t _R=0 ) : NullCodecvtBase(_R) { }

protected:

virtual result do_in( _St& _State ,

const _To* _F1 , const _To* _L1 , const _To*& _Mid1 ,

_E* F2 , _E* _L2 , _E*& _Mid2

) const

{

return noconv ;

}

virtual result do_out( _St& _State ,

const _E* _F1 , const _E* _L1 , const _E*& _Mid1 ,

_To* F2, _E* _L2 , _To*& _Mid2

) const

{

return noconv ;

}

virtual result do_unshift( _St& _State ,

_To* _F2 , _To* _L2 , _To*& _Mid2 ) const

{

return noconv ;

}

virtual int do_length( _St& _State , const _To* _F1 ,

const _To* _L1 , size_t _N2 ) const _THROW0()

{

return (_N2 < (size_t)(_L1 - _F1)) ? _N2 : _L1 - _F1 ;

}

virtual bool do_always_noconv() const _THROW0()

{

return true ;

}

virtual int do_max_length() const _THROW0()

{

return 2 ;

}

virtual int do_encoding() const _THROW0()

{

return 2 ;

}

} ;

完整全文请看:

http://dozb.blogchina.com/1655050.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有