Unicode vs Multibyte
我们的引擎的最初设计是 unicode 的,后来决定同时支持 unicode 和 multibyte 。所以我在 jamfile 里设置了一个叫做 unicode 的 feature 可以开关,这样我就可以得到两个版本。
但是,全部使用 unicode 又不太现实,有些系统提供的东西的接口就没有 unicode 版本,例如 fx 脚本。那么我们必须在 unicode 版本中又用回某些模块的 multibyte 版本。况且我们的引擎是跨平台的,不是所有的平台都像 Windows 这样对 unicode 支持的很好。管理两个版本本来就是一件非常麻烦的事情。
我们的引擎是二进制跨平台的,并且通过二进制模块耦合。这让我们切换单个模块的不同版本相对简单。经过测试,单独调试一个模块时,让其它模块都跑在 Release 版本下丝毫没有问题。所以我开始想着混合 unicode 和 multibyte 的版本的问题。
经过这几天考察,实际上,对于文字处理,大部分涉及模块,都只是将 string 传递来去,并不关心 string 的内容,也不会做复杂的操作。也就是说,大部分模块是没有必要在这个问题上分版本的。而真正涉及版本区别的,一种是引擎跟 OS 的接口。即去拿 A 结尾的 API 还是 W 结尾的 API 。这一点,完全可以运行时区分开。而且获取 OS 的 api 地址,只在初始化时做一次,根本没有性能损耗。
另一种是真正的 string 管理类,那么我们写两份放在同一模块里好了。在获取模块接口的时候根据实际情况构造寻要的一份即可。模块和模块之间的连接都是在启动的时候完成,它们可以正确的拿到需要的版本。
这次这个改动,代码变动量还是很大的。幸亏有一大堆的测试代码在那里可以跑,不然要改的心惊肉跳了。改动完毕后,控制 UNICODE 的宏将只对引擎使用者有用,并且仅仅改动的是引擎接口的描述。使用引擎的人将可以更灵活的作出选择了 :)
补遗: 这篇 blog 名字起的不好,这主要受 VC 对 unicode 工程的预定义宏 _UNICODE 的影响。这里特指 unicode-16 ,所以标题应该将 unicode 改做 widchar 。 事后反思了一下,觉得 Multibyte 足够用了,但是用 ANSI 字符串当是不妥。所以以 UTF-8 最为方便。
Comments
Posted by: 刘海啸 | (14) March 2, 2009 09:33 PM
Posted by: as | (13) May 7, 2008 07:06 PM
Posted by: Cloud | (12) February 8, 2007 11:19 PM
Posted by: 杨城 | (11) February 8, 2007 05:25 PM
Posted by: 夕霞孤雁 | (10) March 26, 2006 03:23 PM
Posted by: Cloud | (9) March 19, 2006 12:53 PM
Posted by: ro4tub | (8) March 19, 2006 11:00 AM
Posted by: Zwinger | (7) March 16, 2006 09:42 AM
Posted by: Cloud | (6) March 14, 2006 12:42 PM
Posted by: shawn | (5) March 14, 2006 02:53 AM
Posted by: Atry | (4) March 12, 2006 11:21 PM
Posted by: Atry | (3) March 12, 2006 03:15 AM
Posted by: Atry | (2) March 12, 2006 03:14 AM
Posted by: Ghost Cheng | (1) March 11, 2006 01:46 AM