动态加载字符映射表的字符转换环境方案

余去年写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>
2011年7月29日 | 归档于 技术, 程序
标签:
  1. 2011年8月24日 17:11 | #1

    这种技术贴 咱这种粗人看不明白.!

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: