chromium中字符串有关的基础设施

大多数c++工程对字符串的操作都是比较频繁的。因为字符集,字符编码,还有c语言风格的字符串,这些东西掺合在一起容易导致使用字符串错误,比如字符乱码,缓冲区溢出等等问题。

windows平台对于字符串的处理有好几套api,掺杂着用,还能凑合着写代码,但是总是觉得不够优雅。幸好chromium base库中提供了一组完善的字符串处理设施,终于能够happy的写字符串相关的代码了。我也把这个字符串库独立出来,用在我写其他的程序工程中。

chromium代码中使用字符串建议

chromium本身是有很多个工程组成的,有的还是第三方的库。一般来说我们使用std::string和string16比较多,string16其实就是std::wstring。WebKit里面是使用WTF::string,跟std::string只有轻微的不同。webkit胶水层是使用WebCString和WebString,也比较少见。

字符编码用的最多的是UTF-8,但是也用到了UTF-16, UCS-2等其他的编码方式。通常我们会使用std::string/char去存放UTF-8编码的字符串。用string16/char16去存放UTF-16格式的字符串。 std::wstring/wchar_t禁止写在跨平台的代码中,因为在不同的平台它有不同的大小,通常也只有在windows平台上使用。

string16

在windows上,wchar_t是2个字节的。但是在其他平台,wchar_t默认是4个字节大小。std::wstring是通过basic_string<wchar_t>实现的,所以直接使用std::wstring运行时可能会失败。std::wstring底层可能会调用c运行时库宽字符处理函数,比如wcslen,它内建的wchar_t是4个字节。

为了保持统一,chromium重新用定义了wchar_t:

我们使用string16的接口跟std::wstring一样,不用考虑wchar_t的差别了。

StringPiece

StringPiece这个类是保存一个const char*类型的字符串指针,但是它本身并不拥有这个指针指向的缓冲区。StringPiece提供了一些std::string常用的接口。StringPiece看似是多余的,因为它只是模仿了std::string的接口。但是StringPiece没有缓冲区拷贝,它只是管理一个字符串指针,并围绕这个字符串指针提供一些类似std::string的接口。chromium之所以会创建这个类大概是为了提高性能。

同样的string16版本的StringPiece是StringPiece16。

StringPiece的成员函数data返回的是字符串的指针,这个值也许为null,所以需要小心这里。同样在StringPiece的生命周期内一定要确保原来的字符串缓存区是有效的,下面这样的代码会出现不可预知的错误。

字符串与其他基本类型的转换

string_number_conversions.h提供了一组接口,在字符串与int,unsigned,int64,uint64,double还有十六进制之间的转换。没什么可说,看接口函数声明就行。

字符串切割

SplitString把一个字符串根据指定分割字符进行切割,返回一个切割后的字符串vector。

SplitStringUsingSubstr可以用另一个字符串做分隔符。

SplitStringIntoKeyValuePairs可以切割key-value对。

还有一些其他的接口,用法类似。

string_tokenizer.h头文件里面有个更加复杂的tokenizer,提供了迭代器思想的接口。

其他字符串处理函数

string_util.h提供了一些常用的字符串复制,拷贝,比较等函数。stringprintf.h则提供了一个类似printf字符串格式化的接口StringPrintf。还有一些字符串编码之间的转换,不一一介绍了。

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注