Ogre引擎源码——UTFString

    技术2022-05-20  26

    继续上次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

     

     


    最新回复(0)