BREW中的字符串操作
这回介绍一下BREW中字符串的操作方法。另外怎样描画字符,选择字体等也做基本的说明。
- 首先温习一下C语言中字符串的操作
- C语言中字符串是作为数组来操作的。标准C库提供了许多字符串操作的函数,比如以下两个字符串结合的程序:
1 |
char * str1 = "Open " ; |
BREW中字符串操作
BREW的字符串与C语言一样,只不过不能使用标准C的函数,取而代之的是与标准C库函数相同功效的Helper函数。
BREW API的参考中有BREW的Helper函数记载,这里我们之举几个例子。
函数名 | 对应的C函数 | 说明 |
---|---|---|
DBGPRINTF | printf | 调试输出 |
MALLOC | malloc | 堆中分配内存 |
FREE | free | 释放内存 |
SPRINTF | sprintf | 格式化字符串 |
STRCMP | strcmp | 字符串比较 |
STRCPY | strcpy | 字符串拷贝 |
STRDUP | strdup | 字符串复制 |
STRLEN | strlen | 字符串长度 |
上面的字符串操作函数用BREW的Helper函数实现如下:
1 |
char * str1 = "Open " ; |
C语言函数printf()对应的Helper函数DBGPRINTF() 使用的时候,输出在模拟器上。
BREW的两种字符形式
BREW中除了和C语言一样的char型,即1个字节的文字类型外,还有AECHAR类型,它是双子的,是宽字符型。
为了输出AECHAR型字符,需要STREXPAND()函数,将char字符串转换为AECHAR字符串。
1 |
void STREXPAND |
下面我们利用 AECHAR 类型和 STREXPAND 函数来实现简单的 hello word! 程序:
1 |
static void HelloWorld_OnAppStart (AEEApplet * app ) |
因为描画文字函数 IDISPLAY_DrawText() 需呀 AECHAR 的字符串参数,我们使用 STREXPAND() 函数将 char 字符串转换为 AECHAR 。描画结束的时候,需要用 FREE() 函数释放内存。
宽字符操作函数
同样与C语言函数对照,如下表所示:
函数名 | C函数 | 说明 |
---|---|---|
WSTRCOMPRESS | 无 | 宽字符字符串转换为char字符串 |
WSPRINTF | sprintf | 格式化字符串 |
WSTRCMP | strcmp | 字符串比较 |
STREXPAND | strcpy | 字符串拷贝 |
WSTRCOMPRESS | strdup | 字符串复制 |
WSTRLEN | strlen | 字符串长 |
STREXPAND | 无 | char字符串转换为宽字符字符串 |
字符编码
也许你想到了 AECHAR 类型既然是16位的字符,那么一定是用 Unicode (UTF-16) 来编码了。其实不是这样的。实际上,BREW 中的 AECHAR 类型的编码完全依赖手机的编码。比如中国的BREW手机是GB2312的,日本的手机是Shift_JIS的。
在 BREW API 的参考文档中STREXPAND()函数有这样的描述—-127以下的文字宽度扩大2倍,超过127的字符拷贝到pDest领域。就是说ASCII的字符 前面加以字节(0x00)作为AECHAR字符,其他的多字符文字都以2个字节大小的AECHAR来保存。
字符串描画与字体
如上面的例子所示BREW中文字描画用 IDISPLAY_DrawText() 函数。通过它指定文字描画坐标,字体,对齐风格等。
1 |
int IDISPLAY_DrawText |
字体需要目标设备支持,如果不支持,选择了也没用。通过 IDISPLAY_GetFontMetrics() 函数可以取得字体大小。
1 |
int IDISPLAY_GetFontMetrics |
另外,BREW中没有字体的宽度这样的信息,在描画特殊的字体时,可以利用 IDISPLAY_MeasureText() 或者IDISPLAY_MeasureTextEx()来计算它。