转载:http://blog.sina.com.cn/s/blog_6b9f3c1f0100tyag.html

体会——UNICODE与ASCII码的关系.

(2011-09-01 20:53:07)

转载▼

标签:

杂谈

分类: mtk

体会——UNICODE与ASCII码的关系.

ASCII:8bits的英文编码,实际使用低7位,127个字符。32(0x20)为空格,之前是控制字符,之后是有效字符。

Unicode:使用两字节对全球字符进行统一编码,有65536个编码,UCS-2为两字节版本(2^16 =65536)。
Unicode little endian:将Unicode中表示同一字符的两个字节顺序反过来,为了适应CPU处理字符的方式,加快处理速度。如:把字符”0xFEFF”存为FFEF的格式。       
Unicode big endian:Unicode字符编码以正序存储。 
一、之间的关系:

UCS2码是用两个字节表示一个字符,如果字符是ASCII码中的字符,则一个字节为空(值为0),另一个字节为原ASCII码中的值。如:ASCII中的a,用UCS2表示为0a或a0。所以UCS2字符中的两个字节有个字节顺序问题,0a为大端,a0为小端。因此,在把UCS2字符转换成其它字符时,要先清楚字节顺序。

二、MTK 中的类型定义:

U8 —— UINT8, unsigned char
U16 —— UINT16, unsigned short
U32 —— UINT32,unsigned long
S8 —— SINT8,char
S16 —— SINT16, short
S32 —— SINT32, long

三、ASCII与UCS2转换:

在MTK中有专门的转换函数如:mmi_asc_to_ucs2(S8* pOutbuffer, S8* pInputbuffer);
假设现有一ASCII数组:char asc_str[20];
如果转为U8则需声明UCS2的数组大小为ASCII数组大小的两倍,U8 ucs_u8_str[40];
如果转为U16则声明的UCS2数组大小可以和ASCII数组大小一样,U16 ucs_u16_str[20];
因为UCS2是用两个字节表示ASCII中的一个字节的,所以如果声明为U8 ucs_u8_str[20];的话,会使的转换结果溢出。(因为大家都是char类型嘛),而声明为U16的话就不需要使其大小为ASCII码数组大小的两倍了,只需要一样大小就可以了,因为U16是unsigned short类型,长度正好是char的两倍,所以正好用2个字节表示ASCII中的一个字节。

在MTK中能够用void gui_print_text(U16* text);函数输出的都是Unicode。

四、UNICODE和ASCII的存储:

存成ASCII形式:如:
char num [10] = {0};
num[0] = '1';
num[1] = '2';
num[2] = '3';
(或者:    strcat((char *) num, "1");
              strcat((char *) num, "2");
              strcat((char *) num, "3");也可以)
在内存中num = {0x31, 0x32, 0x33, 0x00……};
如果是用UNICODE形式存的话:
char num [10] = {0};
UCS2Strcat((char *)num, L"1");
UCS2Strcat((char *)num, L"2");
UCS2Strcat((char *)num, L"3");

(但此处不能用 num[0] = L'1';

num[1] = L'2';
num[2] = L'3';因为以UNICODE形式存的话,系统就会强行把0x31,0x00放到一个char元素里面,结果会出错。所以只能用UCS2Strcat()函数,否则的话就要把num声明为U16类型的也可以直接赋值。)
在内存中num = {0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x00……};
UNICODE每个字符占两个字节。ASCII占一个。如:字符‘A’在内存中的表现:  
unicode定义:wchar_t ch = 'A'; 内存存放两个字节0x41, 0x00 ;//小端存储格式,即高字节在高字位,如果存为0x00, 0x41时,那存储格式为大端,即高字节在低字位
ascii定义:char ch ='A'; 内存存放一个字节0x41

五、UNICODE和ASCII的处理:

char num_text[] = {0x56, 0x00, 0xF7, 0x53, 0x1A, 0xFF, 0x00, 0x00};//text号
在MTK中ASCII和UCS2分别有不同的处理函数,所以两者处理起来也不同:
char* strcat (char*, const char*); strcpy(char *, const char *)等用于处理ASCII类型的字符。
S8 *UCS2Strcpy(S8 *strDestination, const S8 *strSource);S8 *UCS2Strcat(S8 *strDestination, const S8 *strSource);等用于处理UNICODE类型的字符。

两者区别在于,用于处理ASCII的函数在处理字符串的时候是单个字符逐个处理的,也就是碰到0x00就立即结束了。如:在处理“text号”字符串的时候,由于“text号”字符串的第二个元素是0x00,所以就会在此结束。
而处理UNICODE的函数在处理字符串的时候是两个字符一起处理的,也就是把“text号”字符串中的第一个和第二个元素看做一个字符,一起处理,也就是直到碰到连续的两个0x00才会结束。

六、UNICODE保存:

MTK中U8和U16的保存是有区别的。一般U8用的是小端的格式,U16用的是大端的。如:
Const U8 ucs2_u8_str[] = {0x41, 0x00, 0x46, 0x00, 0x00, 0x00};//AF
Const U16 ucs2_u16_str[] = {0x0041, 0x0046, 0x0000};//AF

上面两个字串都表示”AF”,最后的0x0000表示结束符,如果字串不加结束符,则用gui_print_text()显示出来的结果会在字串的最后多一个方框。

MTK:NICODE与ASCII码使用相关推荐

  1. js函数语法:ASCII 码的相互转换,字符串操作,数学计算

    ASCII 码的相互转换 for (let i = 'a'.charCodeAt(); i <= 'z'.charCodeAt(); i++) {a.push(String.fromCharCo ...

  2. 键盘码 ascii码

    ASCII码表 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 A 9 ...

  3. 回车的ascii码_ASCII码表

    ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符.标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到  ...

  4. 将字符串下标为奇数的字符按ASCII码大小递增排序,并将排序后下标为奇数的字符取出

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p92 5.1.2 上级实训内容 [实训内容7]设有一个字符串为baawrskjghzlicda,将字符 ...

  5. ascii码值为负数_作为2020年的程序员,你还在为编码问题困惑?

    如果你是一个生活在2020年的程序员,却不了解字符.字符集.编码和Unicode这些基础知识.那你可要小心了,要是被我抓到你,我会让你在潜水艇里剥六个月洋葱来惩罚你. --来源网络 基本概念科普 为了 ...

  6. AD7606数据采集板使用ASCII码传递BINARY数据

    ■ 问题提出 在 带有128KB缓存的AD7606模拟采集板 后面更新了不带板内缓冲区的C51程序.采集板与计算机之间存在两种实时数据通道: 通过USB-RS232转接串口,波特率为460800 通过 ...

  7. python汉字转到ascii码_python中字母与ascii码的相互转换

    在做python编程时,碰到了需要将字母转换成ascii码的,原本以为用Int()就可以直接将字符串转换成整形了,可是int()带了一个默认参数,base=10,这里表示的是十进制,若出现字母,则会报 ...

  8. HDU 2000 ASCII码排序

    http://acm.hdu.edu.cn/showproblem.php?pid=2000 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符 ...

  9. python3 字符串 转 ascii码

    在这里先解释一下ASCII,Unicode 和 UTF-8这三者的关系 最早出现的是ASCII,一共包含128个字符(一个字节可以表示256种状态,但第一位所有默认为0,所以只有128种).在接下来计 ...

最新文章

  1. today便利 java_在Today今天便利店吃饭,你的要求可以再高一点
  2. pyplot绘图标题错误处理
  3. 【正一专栏】内马尔请不要把球迷的爱当做你交易的筹码
  4. java date 减小时_java 获取本机当前时间并对小时任意加减
  5. QT实现自定义3D材质
  6. 如何调试 web worker
  7. C# 淘宝商品微信返利助手开发-(三)返利助手开发(1)API介绍
  8. ncurses输出函数:字符+字符串的输出
  9. [文章摘录] Is Cloud Computing Really Ready for Prime Time (Computer, 2009)
  10. 微信支付SDK使用总结
  11. 为什么老外不看好Filecoin?
  12. Method called after release()
  13. SptingBoot构建电商基础秒杀项目时遇到的问题
  14. CSS:字体样式(字体系列、大小、加粗、风格、变形等)
  15. 分享【百度搜狗360】SEO优化交流讨论Q群【禁广告/精品群】
  16. 30个真棒的(免费iPhone,iPad IOS)的GUI 界面设计元素模板 做iphone开发的福音
  17. 推荐 8 个高质量的公众号
  18. electron 通过nodejs的winre库实现软件开机自启动
  19. Entity Framework Core系列教程-25-Entity Framework Core日志
  20. NeuroImage:慢性疼痛病人功能脑社区变化的网络结构

热门文章

  1. c# 一种缓存模板
  2. uva10817 dijkstra
  3. poj题目分类(转)--方便分类做题
  4. 企业实战(2) 项目环境搭建之Tomcat部署
  5. MFS分布式文件系统搭建
  6. 为企业搭建Gitlab软件版本管理服务器
  7. 内部办公网与IDC机房的GRE隧道配置实践
  8. CentOS被攻击的分析过程
  9. 安全强化你的 Linux 服务器的七个步骤
  10. Elasticsearch插件介绍及安装