动态加载字符映射表的字符转换环境方案
余去年写Ansi2Unicode的时候,不使用win32 api进行字符转换,使用了自定义转换函数。几个不同编码的转换函数,写起来大同小异。特别是GBK和Big5,可以说是完全一样。于是很早就想开发一个动态加载字符映射表的字符转换环境,当添加新的编码时,不需要改动程序。
现在考虑到的一些特征:
1.独立于平台。Ansi2Unicode的转换函数(toUnicode.h)严重依赖MFC,通用性很差,余一直不太满意
2.字符映射表的信息保存在配置文件(charmap.xml文件),由环境动态加载。环境是一个通用环境,普适各种多字节编码
3.用户制作映射表和添加新的映射表信息遵循一定的规则
4.平台即使在运行时都可以重新载入映射表
5.字符映射表使用优先顺序由在配置文件中出现的顺序决定。用户可调整顺序
这个平台的扩展性非常强。制作映射表,修改charmap.xml,一种新的编码转换方法就添加了,有别于以前需要多写一个函数。
另外,用户还可以替换映射表,随着字符编码的升级而升级。
初步的charmap.xml配置文件
<?xml version="1.0" encoding="utf-8" ?> <charmaps> <charmap> <name>Shift-JIS</name> <version>Microsoft CP932</version> <useinautocheck>true</useinautocheck> <path>charmaps/jis2u-little-endian.map</path> <readingpolicy begin="0x00" end="0x7F" readnext="false" /> <readingpolicy begin="0x80" end="0xA0" readnext="true" /> <readingpolicy begin="0xA1" end="0xDF" readnext="false" /> <readingpolicy begin="0xE0" end="0xFF" readnext="true" /> <segment begin="0x00" end="0x7F" comparefrom="ascii" type="ascii" /> <segment begin="0x80" end="0xA0" comparefrom="0xFFFD" type="undefine" /> <segment begin="0xA1" end="0xDF" comparefrom="buffer" offset="0" type="JIS-X-0201" /> <segment begin="0xE0" end="0x813F" comparefrom="0xFFFD" type="undefine" /> <segment begin="0x8140" end="0xFFFF" comparefrom="buffer" offset="63" type="JIS-X-0208" /> </charmap> <charmap> <name>GBK</name> <version>Microsoft CP936(mozilla enhance)</version> <useinautocheck>true</useinautocheck> <path>charmaps/gb2u-little-endian.map</path> <readingpolicy begin="0x00" end="0x7F" readnext="false" /> <readingpolicy begin="0x80" end="0xFF" readnext="true" /> <segment begin="0x00" end="0x7F" comparefrom="ascii" type="ascii" /> <segment begin="0x80" end="0x813F" comparefrom="0xFFFD" type="undefine" /> <segment begin="0x8140" end="0xFFFF" comparefrom="buffer" offset="0" type="gbk-multiple-char" /> </charmap> <charmap> <name>BIG5</name> <version>Unicode-at-on (UAO) 2.50</version> <useinautocheck>true</useinautocheck> <path>charmaps/b2u-little-endian.map</path> <readingpolicy begin="0x00" end="0x7F" readnext="false" /> <readingpolicy begin="0x80" end="0xFF" readnext="true" /> <segment begin="0x00" end="0x7F" comparefrom="ascii" type="ascii" /> <segment begin="0x80" end="0x813F" comparefrom="0xFFFD" type="undefine" /> <segment begin="0x8140" end="0xFFFF" comparefrom="buffer" offset="0" type="big5-multiple-char" /> </charmap> </charmaps>
这种技术贴 咱这种粗人看不明白.!