BREW中的字符串操作

BREW中的字符串操作

这回介绍一下BREW中字符串的操作方法。另外怎样描画字符,选择字体等也做基本的说明。

首先温习一下C语言中字符串的操作
C语言中字符串是作为数组来操作的。标准C库提供了许多字符串操作的函数,比如以下两个字符串结合的程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char
* str1
 = "Open "
;
char * str2 = "Sesami !" ;
char * str3 ;

int len1 = strlen(str1);
int len2 = strlen(str2);

str3 = (char *) malloc(len1 + len2 + 1);
{
strcpy(str3, str1);
strcpy(str3 + len1, str2);
printf("%s" , str3);
}
free(str3);
BREW中字符串操作

BREW的字符串与C语言一样,只不过不能使用标准C的函数,取而代之的是与标准C库函数相同功效的Helper函数。

BREW API的参考中有BREW的Helper函数记载,这里我们之举几个例子。

函数名对应的C函数说明
DBGPRINTFprintf调试输出
MALLOCmalloc堆中分配内存
FREEfree释放内存
SPRINTFsprintf格式化字符串
STRCMPstrcmp字符串比较
STRCPYstrcpy字符串拷贝
STRDUPstrdup字符串复制
STRLENstrlen字符串长度

上面的字符串操作函数用BREW的Helper函数实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char
* str1
 = "Open "
;
char * str2 = "Sesami !" ;
char * str3 ;

int len1 = STRLEN(str1);
int len2 = STRLEN(str2);

str3 = (char *) MALLOC(len1 + len2 + 1);
{
STRCPY(str3, str1);
STRCPY(str3 + len1, str2);
DBGPRINTF("%s" , str3);
}
FREE(str3);

C语言函数printf()对应的Helper函数DBGPRINTF() 使用的时候,输出在模拟器上。

BREW的两种字符形式

BREW中除了和C语言一样的char型,即1个字节的文字类型外,还有AECHAR类型,它是双子的,是宽字符型。

为了输出AECHAR型字符,需要STREXPAND()函数,将char字符串转换为AECHAR字符串。

1
2
3
4
5
6
7
void
 STREXPAND

(
const byte * pSrc , // char 字符串
int nCount , // char 字符串长
AECHAR * pDest , // AECHAR 字符串内存
int nSize // pDest 内存字节数
)

下面我们利用 AECHAR 类型和 STREXPAND 函数来实现简单的 hello word! 程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static
 void
 HelloWorld_OnAppStart
(AEEApplet
* app
)
{
char * str = "你好 世界!" ;
int len = STRLEN(str);
AECHAR * wstr ;
int wstr_bytes ;

wstr_bytes = (len + 1) * sizeof (AECHAR);
wstr = (AECHAR *) MALLOC(wstr_bytes);

STREXPAND(str, len, wstr, wstr_bytes);

// 描画字符串
IDISPLAY_DrawText(app->m_pIDisplay,
AEE_FONT_BOLD, // 字体
wstr, // 字符串
-1, // -1 = 所有字符串的都表示
0,
0,
NULL , // 限制剪切
IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); // 居中

FREE(wstr);

// 更新,表示
IDISPLAY_Update (app->m_pIDisplay);
}

因为描画文字函数 IDISPLAY_DrawText() 需呀 AECHAR 的字符串参数,我们使用 STREXPAND() 函数将 char 字符串转换为 AECHAR 。描画结束的时候,需要用 FREE() 函数释放内存。

宽字符操作函数

同样与C语言函数对照,如下表所示:

函数名C函数说明
WSTRCOMPRESS宽字符字符串转换为char字符串
WSPRINTFsprintf格式化字符串
WSTRCMPstrcmp字符串比较
STREXPANDstrcpy字符串拷贝
WSTRCOMPRESSstrdup字符串复制
WSTRLENstrlen字符串长
STREXPANDchar字符串转换为宽字符字符串
字符编码

也许你想到了 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int
 IDISPLAY_DrawText

(
IDisplay * pIDisplay , // IDisplay 对象
AEEFont Font , // 字体
const AECHAR * pcText , // 字符串
int nChars , // 字符串长度
int x , // 左上x坐标
int y , // 左上y坐标
const AEERect * prcBackground , // 表示区域
uint32 dwFlags // 对齐风格
)

// 字体
typedef enum {
AEE_FONT_NORMAL =0x8000, // 一般字体
AEE_FONT_BOLD , // 黑体
AEE_FONT_LARGE , // 加大
AEE_FONT_TOTAL // 保留
} AEEFont ;

字体需要目标设备支持,如果不支持,选择了也没用。通过 IDISPLAY_GetFontMetrics() 函数可以取得字体大小。

1
2
3
4
5
6
7
int
 IDISPLAY_GetFontMetrics

(
IDisplay * pIDisplay ,
AEEFont Font , // 指定字体
int * pnAscent , // 字符超出baseline之上的距离
int * pnDescent // 字符超出baseline以下的距离
)

另外,BREW中没有字体的宽度这样的信息,在描画特殊的字体时,可以利用 IDISPLAY_MeasureText() 或者IDISPLAY_MeasureTextEx()来计算它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值