继续上次Ogre的String篇未完的一个文件解读,Unicode String实现类UTFString。
该部分头文件
OgreUTFString.h
虽然只有一个文件,但实现内容很多,不具体列出所有实现细节,尽量理清主要的实现思路,学习一下对unicode字符不同编码的转换。
关于Unicode编码和实现可以参看《Unicode字符编码》。
首先给出一些typedef
//! a single 32-bit Unicode character typedef uint32 unicode_char; //! a single UTF-16 code point typedef uint16 code_point; //! value type typedef for use in iterators typedef code_point value_type; typedef std::basic_string<code_point> dstring; // data string //! string type used for returning UTF-32 formatted data typedef std::basic_string<unicode_char> utf32string;
定义了unicode_char为4个字节,code_point是UTF-16的两字节编码。
dstring是UTFString的data string,是该类最重要的存放数据格式。
utf32string是用于返回UTF-32格式数据,在UTFString中,大多数返回的是UTF-32格式的字符结果。
UTFString主要数据部分如下
dstring mData; union { mutable void* mVoidBuffer; mutable std::string* mStrBuffer; mutable std::wstring* mWStrBuffer; mutable utf32string* mUTF32StrBuffer; }m_buffer;
可以看到,mData是一个dstring类型的,存放的UTF-16格式的字符,这也是windows下默认Unicode的存储方式。
另一个非常重要的就是一个联合类型的字符buffer。这个buffer的作用就是当外部需要得到这个UTFString的其他编码类型时,就在这个buffer中转换,然后返回结果。对应的转换函数名为asUTF8、asUTF32、asWStr。
UTFString声明了内嵌迭代器类来完成辅助字符串基本操作。
迭代器类UML图如下
基础_base_iterator继承自std::iterator,实现了UTFString基础的前向移动,后向移动,设置和读取单个字符。
这里需要自己实现迭代器的原因是让该迭代器适用于UTF-16编码的字符串,使得每次移动的单位都是2个字节。在处理UTF-16需要注意当前字符是否是4字节的情况,即需要一次移动4个字节。
4个子类迭代器扩展实现了前向和后向移动多个字节、自增、自减等操作。
拥有了基础操作的迭代器后,就可以实现string的标准操作了。UTFString中实现了几乎所有std::string的成员函数,如find,assign,replace,insert等。由于不同编码形式的存在,所有函数的编写思路都是先转换成UTF-32,再转换成UTF-16后,对dstring进行操作。也正因为此,UTFString中并没有给出UTF-16与UTF-8之间的转换,而是实现了UTF-16与UTF-8分别对于UTF-32的转换,以UTF-32为转换纽带。具体实现的函数是_utf16_to_utf32、_utf32_to_utf16、_utf8_to_utf32和_utf32_to_utf8。
转换的代码比较固定,在此就不给出了。
下面有个不错的博客用C++实现了Unicode的转换,也可参考。其实转换编码的代码过程基本都是一样的。
http://blog.csdn.net/jhqin/archive/2010/06/22/5687505.aspx