StupidBeauty
Read times:1370Posted at:Mon Jun 18 04:51:25 2012
- no title specified

ClanLib2.0.0文档翻译:字符串及文字服务,Strings and Text Services

ClanLib自带咯字符串类和文字处理辅助类。那些字符串类CL_String、CL_String8 和CL_String16 使用与标准库中的模板类std::basic_string 相同的编程接口。那种语法的一个简单例子如下:

CL_String8 str = "text";

str += "text2";

str[3] = 'a';

const char *null_terminated_c_string = str.c_str();

char *data_ptr = str.data();

CL_String8::size_type size = str.size();

妳应当看一下标准库中的字符串类(std::string / std::basic_string)的文档,以了解一下可在ClanLib 字符串类上进行的不同操作。

在大部分情况下,妳可以只使用CL_String,无需使用那些CL_String8、CL_String16 或字符串引用类。

字符串引用

妳可能会觉得奇怪,在 CL_String 的编程接口与std::string 完全相同的情况下,为什么ClanLib 还要自带字符串类。答案是,标准库中的字符串类提供的控制功能太有限,以至于妳无法控制为一个字符串申请空间的过程。ClanLib引入咯一个字符串引用类,叫做CL_StringRef,它实际上包含一个指向某个字符串的指针和该字符串的长度。大致来说,一个字符串引用等价于一个由两个std::string 迭代器组成的std::pair,但是其语法仍然保持美观。

当妳想要获取某个字符串的一个子字符串时,妳能看到std::string 和CL_String 之间的不同,比如下面这个简单的例子:

CL_String8 str = "hello text world";

CL_StringRef8 substring = str.substr(6, 4);

CL_Console::write_line(substring);

所返回的子字符串是一个引用,而不是一个新的字符串。这就意味着它不需要复制整个字符串,因此就不用冒着申请额外内存的风险来完成这个操作。然而,这同时也意味着,当str 被销毁时,substring 所指向的字符串会变成无效的。要想保留 substring 的话,则按照下面的请求来复制字符串:

CL_String8 str = "hello text world";

CL_String8 substring = str.substr(6, 4);

CL_Console::write_line(substring);

将字符串引用与字符串容器分开的效果就是,一个程序可以更仔细地调整为字符串分配空间的策略,某些情况下这种特殊需求是存在的。ClanLib 中的那些DOM 类就是这样一个例子,因为随便一个XML 文件都可能包含超过100000 个文字字符串。当妳对这么多的字符串进行操作时,内存分配就变得非常敏感咯。当然,大部分情况下妳直接使用CL_String 就行。

统一码支持

ClanLib 中的字符串类有三种形式:8位、16位和文本:

CL_String8 str8 = "8 bit";

CL_String16 str16 = L"16 bit";

CL_String str = cl_text("text");

8位和16位的形式从字面上就可以看出其特点。文本形式就不同了,并且这取决于UNICODE 宏是否被定义。当UNICODE 被定义时,CL_String映射为CL_String16;否则它会映射为CL_String8。这就允许妳在编译的时候决定妳的文本字符串会是8位的还是16位的。cl_text()宏也会依据UNICODE 宏的情况而生成8位或16位的字符串。

字符串的格式化

ClanLib 提供咯CL_StringFormat 类,以辅助对字符串进行格式化。它输入一个字符串模板,在其中搜索到以%n标记的字符串插入点,在这里n 是指参数编号。然后妳指定那些要被插入进去的字符串,于是就生成咯最终的字符串:

CL_StringFormat format(cl_text("Hello %1, why did %2 reply %3?"));

format.set_arg(1, cl_text("Buddy"));

format.set_arg(2, "you");

format.set_arg(3, 42);

CL_String result = format.get_result();

可使用模板函数cl_format 来将代码缩短:

CL_String result = cl_format("Hello %1, why did %2 reply %3?", "Buddy", "you", 42);

字符串辅助类

除咯以上的类之外,CL_StringHelp这个类还包含咯一系列的静态辅助函数,它们能帮助妳进行一些通用的字符串操作。例如,从本地的8位字符集转换成UCS-2,再从UCS-2 转换成Latin-9,则这样写:

CL_String8 local8 = "blabla";

CL_String16 ucs2 = CL_StringHelp::local8_to_ucs2(local8);

CL_String8 latin9 = CL_StringHelp::ucs2_to_latin9(ucs2);

另外的一些简单示例:

CL_String str = cl_text("16");

int value = CL_StringHelp::text_to_int(str);

CL_String mixed = cl_text("MiXeD CaSe");

CL_String upper = CL_StringHelp::text_to_upper(mixed);

CL_String lower = CL_StringHelp::text_to_lower(mixed);

终端输出和记录

如果妳想向标准输出流输出东西,则可使用CL_Console:

CL_Console::write_line("Hello %1 world!", "console");

文本服务还提供咯一个简单的记录接口:

CL_FileLogger file_logger("logfile.txt");

file_logger.enable();

cl_log_event("system", "System log message");

cl_log_event("info", "Info log message %1", 42);

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands