k歌里的好友全民k歌怎么删掉好友除

Unicode详解 - 简书
Unicode详解
字符编码的问题,每个程序员都会遇到,深入探索其背后的原理和机制,能让我们少走很多弯路。
1、历史简述
Unicode(万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
Unicode发展由非营利机构统一码联盟负责,该机构致力于让Unicode方案替换既有的字符编码方案。因为既有的方案往往空间非常有限,亦不适用于多语环境。
统一码联盟在1991年首次发布了The Unicode Standard。
在2005年,Unicode的第十万个字元被引入成为标准之一,该字元被用于马拉雅拉姆语。
2、编码方式
目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示2的16次(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。
最新(但未实际广泛使用)的统一码版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会涵盖UCS-4的所有字符。UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示2的31次方个字符,完全可以涵盖一切语言所用的符号。
通用字符集(Universal Character Set)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。
通用字符集包括了其他所有字符集。它保证了与其他字符集的双向兼容,即,如果你将任何文本字符串翻译到UCS格式,然后再翻译回原编码,你不会丢失任何信息。
UCS包含了已知语言的所有字符。除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的方块文字,UCS还包括大量的图形、印刷、数学、科学符号。
ISO/IEC 10646定义了一个31位的字符集。
并不是所有的系统都需要支持像组合字符这样的的先进机制。因此ISO 10646指定了如下三种实现级别:
级别1:不支持组合字符和谚文字母字符。
级别2:类似于级别1,但在某些文字中,允许一列固定的组合字符,因为如果没有最起码的几个组合字符,UCS就不能完整地表达这些语言。
级别3:支持所有的通用字符集字符,如,可以在任意一个字符上加上一个箭头或一个鼻音化符号.
历史上存在两个独立的尝试创立单一字符集的组织,即:
1、国际标准化组织(ISO)于1984年创建的ISO/IEC
2、统一码联盟
统一码联盟和ISO/IEC都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。
4、实现方式
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。
Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
前面说到,Unicode采用2个字节来编码文件,但是如果一个仅包含7位ASCII字符的Unicode文件,每个字符使用2字节就浪费了一般的存储空间,其第一字节的8位始终为0,这是难以忍受。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。
问题来了,UTF-8变长编码格式的出现是为了节省存储空间,变长导致了UTF-8的兼容性相应降低。
类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。
也就是说,UTF-16是为未来准备的变长编码格式。
还有就是,在Mac和普通PC上,对于字节顺序的理解是不一致的。这时同一字节流可能会被解释为不同内容,如某字符为十六进制编码4E59,按两个字节拆分为4E和59,在Mac上读取时是从低字节开始,那么在Mac OS会认为此4E59编码为594E,找到的字符为“奎”,而在Windows上从高字节开始读取,则编码为U+4E59的字符为“乙”。就是说在Windows下以UTF-16编码保存一个字符“乙”,在Mac OS环境下打开会显示成“奎”。此类情况说明UTF-16的编码顺序若不加以人为定义就可能发生混淆。
于是在UTF-16编码实现方式中使用了大端序(Big-Endian,简写为UTF-16 BE)、小端序(Little-Endian,简写为UTF-16 LE)的概念,以及可附加的字节顺序记号解决方案,目前在PC机上的Windows系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。目前在PC机上的Windows系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。
在Windows XP附带的记事本,“另存为”对话框可以选择的四种编码方式除去非Unicode编码的ANSI(对于英文系统即ASCII编码),中文系统则为GB2312或Big5外,其余三种为“Unicode”(对应UTF-16 LE)、“Unicode big endian”(对应UTF-16 BE)和“UTF-8”。
UTF-8,是我们最经常看到的编码格式之一。前面已经简单介绍过,这是一种变长编码格式,变长的目的是节省存储空间。
UTF-8使用一至六个字节为每个字符编码(2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节)。
下面介绍其编码规则:
1、128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
2、带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文等则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
3、其他基本多文种平面(BMP)中的字元(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
4、其他极少使用的Unicode 辅助平面的字元使用四至六字节编码。(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。
对上述提及的第四种字元而言,UTF-8使用四至六个字节来编码似乎太耗费资源了。但UTF-8对所有常用的字元都可以用三个字节表示,而且它的另一种选择,UTF-16编码,对前述的第四种字符同样需要四个字节来编码,所以要决定UTF-8或UTF-16哪种编码比较有效率,还要视所使用的字元的分布范围而定。
下面来看看UTF-8具体怎么编码各种类型的字符:
1、单字节编码,字节由零开始:0zzzzzzz。(z取值0或1,下同)
2、两字节编码:(110yyyyy 10zzzzzz)第一个字节由110开始,接着的字节由10开始
3、三字节编码:(01110xxxx10yyyyyy 10zzzzzz)第一个字节由1110开始,接着的字节由10开始。
4、四字节编码:(11110www 10xxxxxx 10yyyyyy 10zzzzzz)将由11110开始,接着的字节由10开始
Unicode和UTF-8之间的转换关系表
UTF-16是Unicode字符编码五层次模型的第三层:字符编码表。即把Unicode字符集的抽象码位映射为16位长的整数,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。
Unicode的编码空间从U+0000到+10FFFF,共有1,112,064个码位(code point)可用来映射字符. Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从,共计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0)。其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。
分平面来介绍UTF-16的实现方式:
1、第一个Unicode平面(码位从U+0000至U+FFFF)包含了最常用的字符。该平面被称为基本多语言平面,缩写为BMP(Basic Multilingual Plane, BMP)。UTF-16与编码这个范围内的码位为16比特长的单个码元,数值等价于对应的码位. BMP中的这些码位是仅有的可以在UCS-2中表示的码位.
2、辅助平面(Supplementary Planes)中的码位,在UTF-16中被编码为一对16比特长的码元(即32bit,4Bytes),称作代理对(surrogate pair),具体方法是:
码位减去0x10000,得到的值的范围为20比特长的0..0xFFFFF.
高位的10比特的值(值的范围为0..0x3FF)被加上0xD800得到第一个码元或称作高位代理。
低位的10比特的值(值的范围也是0..0x3FF)被加上0xDC00得到第二个码元或称作低位代理(low surrogate),现在值的范围是0xDC00..0xDFFF.
算法可理解为:辅助平面中的码位从U+10000到U+10FFFF,共计FFFFF个,即220=1,048,576个,需要20位来表示。如果用两个16位长的整数组成的序列来表示,第一个整数(称为前导代理)要容纳上述20位的前10位,第二个整数(称为后尾代理)容纳上述20位的后10位。还要能根据16位整数的值直接判明属于前导整数代理的值的范围(210=1024),还是后尾整数代理的值的范围(也是210=1024)。因此,需要在基本多语言平面中保留不对应于Unicode字符的2048个码位,就足以容纳前导代理与后尾代理所需要的编码空间。这对于基本多语言平面总计65536个码位来说,仅占3.125%.
3、Unicode标准规定U+D800..U+DFFF的值不对应于任何字符.
Unicode与UTF-16对应图
参考资料:
现在已不熟悉Python、MongoDB、LPC、C++、php。
在做Java Web...2014年11月 VC/MFC大版内专家分月排行榜第三
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。当前位置: &
unicode中文是什么意思
中文翻译○unicode字符编码单代码国际统一字符编码标准汉化版统一代码统一的字符编码标准, 采用双字节对字符进行编码 unicode的意思相关词组统一码,联合码统一字符编码标准,采用双字节对字符进行编码统一字符标准万国码&&&&补完计画&&&&万国码&&&&unicode联盟; 统一码联盟&&&&unicode consortium&&&&unicode字符列表&&&&单码字符转义序列&&&&单码状态分配&&&&其实是&&&&万国码&&&&unicode&&&&list of unicode characters&&&&国际自行车和摩托车贸易及修理联合会&&&&双面涂布机&&&&尤尼科公司&&&&优尼公司&&&&单斜
例句与用法Using native , character , or unicode formats使用本机格式、字符格式或unicode格式A variable - length stream of non - unicode characters非unicode字符的变长流(只限For example , for a unicode string value ,例如,对于一个unicode字符串值,可以用Programming database applications with unicode使用unicode进行数据库应用程序编程To display unicode output in the output window在“输出”窗口中显示unicode输出Converts a specified value to a unicode character将指定的值转换为unicode字符。 Can also process and display unicode characters也可以处理并显示unicode字符。 A unicode space is defined as hexadecimal 0x20Unicode空格定义为十六进制的0x20 。 Marshal strings as unicode 2 - byte characters以unicode 2字节字符形式封送字符串。 Gets the unicode category of the specified character获取指定字符的unicode类别。 更多例句:&&1&&&&&&
百科解释Unicode is a computing industry standard for the consistent encoding, representation and handling of text expressed in most of the world's writing systems. Developed in conjunction with the Universal Character Set standard and published in book form as The Unicode Standard, the latest version of Unicode contains a repertoire of more than 110,000 characters covering 100 scripts.详细百科解释
相邻词汇热门词汇
unicode的中文翻译,unicode是什么意思,怎么用汉语翻译unicode,unicode的中文意思,发音,例句,用法和解释由查查在线词典提供,版权所有违者必究。
&&&&&&&&&&&&&&&&
Copyright &
(京ICP备号)
All rights reserved您的位置:& &
Unicode编码
什么是Unicode编码
Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。
Unicode伴随着通用字符集的标准而发展,同时也以书本的形式[1]对外发表。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为第六版,已收入了超过十万个字符(第十万个字符在2005年获采纳)。Unicode涵盖的数据除了视觉上的字形、编码方法、标准的字符编码外,还包含了字符特性,如大小写字母。
Unicode发展由非营利机构统一码联盟负责,该机构致力于让Unicode方案取代既有的字符编码方案。因为既有的方案往往空间非常有限,亦不适用于多语环境。
Unicode备受认可,并广泛地应用于计算机软件的国际化与本地化过程。有很多新科技,如可扩展置标语言、Java编程语言以及现代的操作系统,都采用Unicode编码。
为什么用Unicode编码
1) Unicode使程序的本地化变得更容易。
2) 使用Unicode,只需发布一个二进制(.exe或DLL)文件,即可支持所有语言。
3) Unicode提升了应用程序的效率,因为代码执行速度更快,占用内存更少。Windows内部的一切工作都是使用Unicode字符和字符串来进行的。 所以,假如你非要传入ANSI字符或字符串,Windows就会被迫分配内存,并将ANSI字符或字符串转换为等价的Unicode形式。
4) 使用Unicode,你的应用程序能轻松调用所有不反对使用(nondeprecated)的Windows函数,因为一些Windows函数提供了只能处理Unicode字符和字符串的版本。
5) 使用Unicode,你的代码很容易与COM集成(后者要求使用Unicode字符和字符串)。
6) 使用Unicode,你的代码很容易与.NET Framework集成(后者要要求使用Unicode字符和字符串)。
7) 使用Unicode,能保证你的代码能够轻松操纵你自己的资源(其中的字符串总是Unicode的)。
8) 使用Unicode,只要一个EXE可执行文件,在界面上就可以正常显示所有的语言。
wchar_t : 是使用2个字节表示一个符号,最多表示2^16个字符,对于世界上现行使用的字符来说,使用wchar_t就能够全部表示出来。而char : 是使用一个字节表示的范围只有256,不能表达所有的字符。
对于Unicode 和 UTF-8 来说可以是等价的,两种编码都能够表示全世界所有的字符。区别在于UTF-8是可变长编码,在表示英文字母时只用了一个字节,这样大大的节省了存储空间。
9) 使用Unicode,只要一个EXE可执行文件,可以保证在不同语言环境下正常运行。
在韩文系统中的“\”与 英文中的“\”不是一样的。我们对于路径的处理时会用到strrchr(szbuffer, '\\'),然而在韩文系统中会不能正确的找到,导致我们的程序出现错误。如果使用Unicode的 _tcsrchr(szBuffer, _T('\\')),则能够让程序很好的运行。
如何使用UNICODE
1) 首先推荐的类型是TCHAR(通用字符类型)。当定义了_UNICODE宏的时候,TCHAR就是WCHAR,当没有定义这个宏的时候,TCHAR就是char,TCHAR的定义如下:
#ifdef UNICODE // r_winnt
typedef WCHAR TCHAR, *PTCHAR;
#else /* UNICODE */ // r_winnt
typedef char TCHAR, *PTCHAR;
#endif /* !_TCHAR_DEFINED */
通过TCHAR,只需要这样一段代码:
TCHAR tStr[] = _T(&t code&);
MessageBox(tStr);
就可以支持UNICODE和MULTIBYTE两种版本。_T宏的作用就是转换成TCHAR。
2) 关于其他的处理
首先是常用的CString,它本身就支持UNICODE。下面的例子说明了用法:
CString *pFileName = new CString(&c://tmpfile.txt&);
#ifdef _UNICODE
m_hFile = CreateFile(pFileName-&AllocSysString(), GENERIC_READ |
GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
m_hFile = CreateFile(pFileName-&GetBuffer(pFileName-&GetLength()),
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
3) 当我们在UNICODE方式中需要为一个字串常量附值时可以使用L宏,如:
BSTR wcsStr = L&unicode&;
这样的附值很简便,但是,经过L宏处理后的字串一定是UNICODE,如果你吧它附给一个MULTIBYTE的字串,字符将可能会被截断。
另外,VC还提供了一些函数如WideCharToMultiByte和MultiByteToWideChar还有另外的一些宏来支持转换。
4) 编译器的设置:
在project-&Property对话框中的“General”的页面,在“Character set”中选择“Use Unicode character set”完成项目Unicode设置。
Windows定义的Unicode数据类型
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
如何对Unicode进行操作
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
Unicode字符串常量
ANSI &string&
Unicode L&string&
ANSI/Unicode _T(&string&) 或_TEXT(&string&) If( szError[0] == T(‘J') ){ }
推荐只使用_T 宏。
我们的资质荣誉
2006年 中国共享软件最佳服务奖
2007年 优秀共享软件常青树奖
2010年 长沙创业明星企业
"用CCProxy上网行为管理,有效的控制非工作上网行为所带来的无形效益损失成本,如造成管理效率的下降、订单流失、意外事件的发生,以及对团队精神造成的不良影响,如纪律松散、组织效率低下、文化萧条等。"
-某知名电商公司CTO
"员工工作时间滥用网络行为不但会造成带宽紧张,影响到整个企业的运营,也可能随之给单位企业带来严重的信息网络安全稳患,如受到病毒、黑客攻击"
-某IT公司技术总监
中国妇女出版社
西南政法大学
小浪底建设管理局
兴业银行上海分行
西安喜来登大酒店
云南省体育科研所
九牧实业有限公司
湖南女子职业大学
长城证券有限公司
乌鲁木齐市气象局
民生银行石家庄分行
无锡工艺职业学院
农业银行四川分行
乌鲁木齐市气象局
民生银行石家庄分行
西南政法大学
广东协和神学院
环境管理干部学院
小浪底建设管理局
浙江可立思安制药最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符。显然,这样要表示各种语言中所有的字符是远远不够的。Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符。
Unicode只是一个编码规范,目前实际实现的unicode编码只要有三种:UTF-8,UCS-2和UTF-16,三种unicode字符集之间可以按照规范进行转换。
UTF-8是一种8位的unicode字符集,编码长度是可变的,并且是ASCII字符集的严格超集,也就是说ASCII中每个字符的编码在UTF-8中是完全一样的。UTF-8字符集中,一个字符可能是1个字节,2个字节,3个字节或者4个字节长。一般来说,欧洲的字母字符长度为1到2个字节,而亚洲的大部分字符则是3个字节,附加字符为4个字节长。
Unix平台中普遍支持UTF-8字符集,HTML和大多数浏览器也支持UTF-8,而window和java则支持UCS-2。
UTF-8的主要优点:
对于欧洲字母字符需要较少的存储空间。
容易从ASCII字符集向UTF-8迁移。
UCS-2是固定长度为16位的unicode字符集。每个字符都是2个字节,UCS-2只支持unicode3.0,所以不支持附加字符。
UCS-2的优点:
对于亚洲字符的存储空间需求比UTF-8少,因为每个字符都是2个字节。
处理字符的速度比UTF-8更快,因为是固定长度编码的。
对于windows和java的支持更好。
UTF-16也是一种16位编码的字符集。实际上,UTF-16就是UCS-2加上附加字符的支持,也就是符合unicode4.0规范的UCS-2。所以UTF-16是UCS-2的严格超集。
UTF-16中的字符,要么是2个字节,要么是4个字节表示的。UTF-16主要在windows2000以上版本使用。
UTF-16相对UTF-8的优点,和UCS-2是一致的。
Oracle从7.0开始提供对Unicode的支持。Oracle个版本的unicode字符集支主要有:
一种UTF-8编码的字符集,支持最新的unicode4.0标准。字符长度为1,2或者3个字节,附加字符则为4字节长。
支持unicode3.0的UTF-8编码方式。由于附加字符是在unicode3.1中提出的,UTF8不支持附加字符。但是unicode3.0已经为附加字符预留了编码空间,所以即使在UTF8的数据库中插入附加字符,也是可以的,只是数据库会将该字符分隔成两部分,需要占6个字符的长度。所以,如果需要支持附加字符,那么建议将数据库的字符集切换为新的AL32UTF8。
UTF8可用于数据库字符集,也可用于国家字符集。
UTFE是基于EBCDIC平台的unicode字符集,就像ASCII平台上的UTF8一样。不同的是,UTFE中,每个字符可能占1,2,3或者4个字节,而附加字符则需要2个4个字节,也就是8个字节来表示。
AL16UTF16是一种UTF-16编码的unicode字符集,在Oracle中用于国家字符集。
AL24UTFFSS
该字符集只支持unicode1.1规范,在Oracle7.2~8i版本中使用,目前已经淘汰。
CString在Unicode下一个字节占16bit,在ascii下占8bit,改成char数组后在什么环境下都一样的
编写程序最好是:同一个源文件既可以在UNICODE下编译,又可以在ANSI下编译工程--设置--C/C++--预处理器,可以定义标识符,如UNICODE,_UNICODE,标识是按ASCII编译,还是按UNICODE编译#include &tchar.h&char定义全部 改成TCHAR,TCHAR根据设置不同定义为char或者wchar字符串加用TEXT宏,如TEXT("你好"),根据编译器的设置不同,分别定义为ANSI或者UNICODE版本字符串也大部分有其通用版本:最大长度版比标准版多一个参数,表示缓冲区的长度有v的其参数为参数列表指针,使用va_list、va_start和va_end宏C提供的字符串函数: ASCII 宽字符 通用形式1.可变参数:标准版 sprintf swprintf _stprintf最大长度版 _snprintf _snwprintf _sntprintfWindowsNT版 wsprintfA wsprintfW wsprintf2.数组的指针作参数:&&&标准版 vsprintf vswprintf _vstprintf最大长度版 _vsnprintf _vsnwprintf _vsntprintfWindowsNT版 wvsprintfA wvsprintfW wvsprintf以下引用《Windows程序设计》美国标准早期计算机的字符码是从Hollerith卡片(号称不能被折迭、卷曲或毁伤)发展而来的,该卡片由Herman Hollerith发明并首次在1890年的美国人口普查中使用。6位字符码系统BCDIC(Binary-Coded Decimal Interchange Code:二进制编码十进制交换编码)源自Hollerith代码,在60年代逐步扩展为8位EBCDIC,并一直是IBM大型主机的标准,但没使用在其它地方。美国信息交换标准码(ASCII:American Standard Code for Information Interchange)起始于50年代后期,最后完成于1967年。开发ASCII的过程中,在字符长度是6位、7位还是8位的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字符,因此ASCII不能是6位编码,但由于费用的原因也排除了8位版本的方案(当时每位的储存空间成本仍很昂贵)。这样,最终的字符码就有26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格,总共128个字符码。ASCII现在记录在ANSI X3.4-1986字符集-用于信息交换的7位美国国家标准码(7-Bit ASCII:7-Bit American National Standard Code for Information Interchange),由美国国家标准协会(American National Standards Institute)发布。图2-1中所示的ASCII字符码与ANSI文件中的格式相似。ASCII有许多优点。例如,26个字母代码是连续的(在EBCDIC代码中就不是这样的);大写字母和小写字母可通过改变一位数据而相互转化;10个数字的代码可从数值本身方便地得到(在BCDIC代码中,字符「0」的编码在字符「9」的后面!)最棒的是,ASCII是一个非常可靠的标准。在键盘、视讯显示卡、系统硬件、打印机、字体文件、操作系统和Internet上,其它标准都不如ASCII码流行而且根深蒂固。 图2-1 ASCII字符集国际方面ASCII的最大问题就是该缩写的第一个字母。ASCII是一个真正的美国标准,所以它不能良好满足其它讲英语国家的需要。例如英国的英镑符号(£)在哪里?英语使用拉丁(或罗马)字母表。在使用拉丁语字母表的书写语言中,英语中的单词通常很少需要重音符号(或读音符号)。即使那些传统惯例加上读音符号也无不当的英语单字,例如c鰋perate或者r&sum&,拼写中没有读音符号也会被完全接受。但在美国以南、以北,以及大西洋地区的许多国家,在语言中使用读音符号很普遍。这些重音符号最初是为使拉丁字母表适合这些语言读音不同的需要。在远东或西欧的南部旅游,您会遇到根本不使用拉丁字母的语言,例如希腊语、希伯来语、阿拉伯语和俄语(使用斯拉夫字母表)。如果您向东走得更远,就会发现中国象形汉字,日本和朝鲜也采用汉字系统。ASCII的历史开始于1967年,此后它主要致力于克服其自身限制以更适合于非美国英语的其它语言。例如,1967年,国际标准化组织(ISO:International Standards Organization)推荐一个ASCII的变种,代码0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D「为国家使用保留」,而代码0x5E、0x60和0x7E标为「当国内要求的特殊字符需要8、9或10个空间位置时,可用于其它图形符号」。这显然不是一个最佳的国际解决方案,因为这并不能保证一致性。但这却显示了人们如何想尽办法为不同的语言来编码的。扩展ASCII在小型计算机开发的初期,就已经严格地建立了8位字节。因此,如果使用一个字节来保存字符,则需要128个附加的字符来补充ASCII。1981年,当最初的IBM PC推出时,视讯卡的ROM中烧有一个提供256个字符的字符集,这也成为IBM标准的一个重要组成部分。最初的IBM扩展字符集包括某些带重音的字符和一个小写希腊字母表(在数学符号中非常有用),还包括一些块型和线状图形字符。附加的字符也被添加到ASCII控制字符的编码位置,这是因为大多数控制字符都不是拿来显示用的。该IBM扩展字符集被烧进无数显示卡和打印机的ROM中,并被许多应用程序用于修饰其文字模式的显示方式。不过,该字符集并没有为所有使用拉丁字母表的西欧语言提供足够多的带重音字符,而且也不适用于Windows。Windows不需要图形字符,因为它有一个完全图形化的系统。在Windows 1.0(1985年11月发行)中,Microsoft没有完全放弃IBM扩展字符集,但它已退居第二重要位置。因为遵循了ANSI草案和ISO标准,纯Windows字符集被称作「ANSI字符集」。ANSI草案和ISO标准最终成为ANSI/ISO 7,即「American National Standard for Information Processing-8-Bit Single-Byte Coded Graphic Character Sets-Part 1: Latin Alphabet No 1」,通常也简写为「Latin 1」。在Windows 1.0的《Programmer's Reference》中印出了ANSI字符集的最初版本,如图2-2所示。 图2-2 Windows ANSI字符集(基于ANSI/ISO 8859-1)空方框表示该位置未定义字符。这与ANSI/ISO 8859-1的最终定义一致。ANSI/ISO 8859-1仅显示了图形字符,而没有控制字符,因此没有定义DEL。此外,代码0xA0定义为一个非断开的空格(这意味着在编排格式时,该字符不用于断开一行),代码0xAD是一个软连字符(表示除非在行尾断开单词时使用,否则不显示)。此外,ANSI/ISO 8859-1将代码0xD7定义为乘号(*),0xF7为除号(/)。Windows中的某些字体也定义了从0x80到0x9F的某些字符,但这些不是ANSI/ISO 8859-1标准的一部分。MS-DOS 3.3(1987年4月发行)向IBM PC用户引进了代码页(code page)的概念,Windows也使用此概念。代码页定义了字符的映像代码。最初的IBM字符集被称作代码页437,或者「MS-DOS Latin US)。代码页850就是「MS-DOS Latin 1」,它用附加的带重音字母(但不是图2-2所示的Latin 1 ISO/ANSI标准)代替了一些线形字符。其它代码页被其它语言定义。最低的128个代码总是相同的;较高的128个代码取决于定义代码页的语言。在MS-DOS中,如果用户为PC的键盘、显示卡和打印机指定了一个代码页,然后在PC上创建、编辑和打印文件,一切都很正常,每件事都会保持一致。然而,如果用户试图与使用不同代码页的用户交换文件,或者在机器上改变代码页,就会产生问题。字符码与错误的字符相关联。应用程序能够将代码页信息与文件一起保存来试图减少问题的产生,但该策略包括了某些在代码页间转换的工作。虽然代码页最初仅提供了不包括带重音符号字母的附加拉丁字符集,但最终代码页的较高的128个字符还是包括了完整的非拉丁字母,例如希伯来语、希腊语和斯拉夫语。自然,如此多样会导致代码页变得混乱;如果少数带重音的字母未正确显示,那么整个文字便会混乱不堪而不可阅读。代码页的扩展正是基于所有这些原因,但是还不够。斯拉夫语的MS-DOS代码页855与斯拉夫语的Windows代码页1251以及斯拉夫语的Macintosh代码页10007不同。每个环境下的代码页都是对该环境所作的标准字符集修正。IBM OS/2也支援多种EBCDIC代码页。但等一下,你会发现事情变得更糟糕。双字节字符集迄今为止,我们已经看到了256个字符的字符集。但中国、日本和韩国的象形文字符号有大约21,000个。如何容纳这些语言而仍保持和ASCII的某种兼容性呢?解决方案(如果这个说法正确的话)是双字节字符集(DBCS:double-byte character set)。DBCS从256代码开始,就像ASCII一样。与任何行为良好的代码页一样,最初的128个代码是ASCII。然而,较高的128个代码中的某些总是跟随着第二个字节。这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。虽然中文、日文和韩文共享一些相同的象形文字,但显然这三种语言是不同的,而且经常是同一个象形文字在三种不同的语言中代表三件不同的事。Windows支持四个不同的双字节字符集:代码页932(日文)、936(简体中文)、949(韩语)和950(繁体汉字)。只有为这些国家(地区)生产的Windows版本才支持DBCS。双字符集问题并不是说字符由两个字节代表。问题在于一些字符(特别是ASCII字符)由1个字节表示。这会引起附加的程序设计问题。例如,字符串中的字符数不能由字符串的字节数决定。必须剖析字符串来决定其长度,而且必须检查每个字节以确定它是否为双字节字符的首字节。如果有一个指向DBCS字符串中间的指针,那么该字符串前一个字符的地址是什么呢?惯用的解决方案是从开始的指针分析该字符串!Unicode解决方案我们面临的基本问题是世界上的书写语言不能简单地用256个8位代码表示。以前的解决方案包括代码页和DBCS已被证明是不能满足需要的,而且也是笨拙的。那什么才是真正的解决方案呢?身为程序写作者,我们经历过这类问题。如果事情太多,用8位数值已经不能表示,那么我们就试更宽的值,例如16位值。而且这很有趣的,正是Unicode被制定的原因。与混乱的256个字符代码映像,以及含有一些1字节代码和一些2字节代码的双字节字符集不同,Unicode是统一的16位系统,这样就允许表示65,536个字符。这对表示所有字符及世界上使用象形文字的语言,包括一系列的数学、符号和货币单位符号的集合来说是充裕的。明白Unicode和DBCS之间的区别很重要。Unicode使用(特别在C程序设计语言环境里)「宽字符集」。「Unicode中的每个字符都是16位宽而不是8位宽。」在Unicode中,没有单单使用8位数值的意义存在。相比之下,在双字节字符集中我们仍然处理8位数值。有些字节自身定义字符,而某些字节则显示需要和另一个字节共同定义一个字符。处理DBCS字符串非常杂乱,但是处理Unicode文字则像处理有秩序的文字。您也许会高兴地知道前128个Unicode字符(16位代码从0xF)就是ASCII字符,而接下来的128个Unicode字符(代码从0xFF)是ISO 8859-1对ASCII的扩展。Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。希腊字母表使用从0xFF的代码,斯拉夫语使用从0xFF的代码,美国使用从0xF的代码,希伯来语使用从0xFF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0xFFF的代码。Unicode的最大好处是这里只有一个字符集,没有一点含糊。Unicode实际上是个人计算机行业中几乎每个重要公司共同合作的结果,并且它与ISO 10646-1标准中的代码是一一对应的。Unicode的重要参考文献是《The Unicode Standard,Version 2.0》(Addison-Wesley出版社,1996年)。这是一本特别的书,它以其它文件少有的方式显示了世界上书写语言的丰富性和多样性。此外,该书还提供了开发Unicode的基本原理和细节。Unicode有缺点吗?当然有。Unicode字符串占用的内存是ASCII字符串的两倍。(然而压缩文件有助于极大地减少文件所占的磁盘空间。)但也许最糟的缺点是:人们相对来说还不习惯使用Unicode。身为程序写作者,这就是我们的工作。宽字符和 C对C程序写作者来说,16位字符的想法的确让人扫兴。一个char和一个字节同宽是最不能确定的事情之一。没几个程序写作者清楚ANSI/ISO ,这是「美国国家标准程序设计语言-C」(也称作「ANSI C」)通过一个称作「宽字符」的概念来支持用多个字节代表一字符的字符集。这些宽字符与常用的字符完美地共存。ANSI C也支持多字节字符集,例如中文、日文和韩文版本Windows支持的字符集。然而,这些多字节字符集被当成单字节构成的字符串看待,只不过其中一些字符改变了后续字符的含义而已。多字节字符集主要影响C语言程序执行时期链接库函数。相比之下,宽字符比正常字符宽,而且会引起一些编译问题。宽字符不需要是Unicode。Unicode是一种可能的宽字符集。然而,因为本书的焦点是Windows而不是C执行的理论,所以我将把宽字符和Unicode作为同义语。Char数据型态假定我们都非常熟悉在C程序中使用char数据型态来定义和储存字符跟字符串。但为了便于理解C如何处理宽字符,让我们先回顾一下可能在Win32程序中出现的标准字符定义。下面的语句定义并初始化了一个只包含一个字符的变量:char c = 'A' ;&&&&&&&变量c需要1个字节来保存,并将用十六进制数0x41初始化,这是字母A的ASCII代码。您可以像这样定义一个指向字符串的指针:char *&&&&&&&因为Windows是一个32位操作系统,所以指针变量p需要用4个字节保存。您还可初始化一个指向字符串的指针:char * p = "Hello!" ;&&&&&&&像前面一样,变量p也需要用4个字节保存。该字符串保存在静态内存中并占用7个字节-6个字节保存字符串,另1个字节保存终止符号0。您还可以像这样定义字符数组:char a[10] ;&&&&&&&在这种情况下,编译器为该数组保留了10个字节的储存空间。表达式sizeof(a)将返回10。如果数组是整体变量(即在所有函数外定义),您可使用像下面的语句来初始化一个字符数组:char a[] = "Hello!" ;&&&&&&&如果您将该数组定义为一个函数的区域变量,则必须将它定义为一个static变量,如下:static char a[] = "Hello!" ;&&&&&&&无论哪种情况,字符串都储存在静态程序内存中,并在末尾添加0,这样就需要7个字节的储存空间。宽字符Unicode或者宽字符都没有改变char数据型态在C中的含义。char继续表示1个字节的储存空间,sizeof (char)继续返回1。理论上,C中1个字节可比8位长,但对我们大多数人来说,1个字节(也就是1个char)是8位宽。C中的宽字符基于wchar_t数据型态,它在几个表头文件包括WCHAR.H中都有定义,像这样:typedef unsigned short wchar_&&&&&&&因此,wchar_t数据型态与无符号短整数型态相同,都是16位宽。要定义包含一个宽字符的变量,可使用下面的语句:wchar_t c = 'A' ;&&&&&&&变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在内存中。如果检查Unicode文字的计算机储存应注意这一点。)您还可定义指向宽字符串的指针:wchar_t * p = L"Hello!" ;&&&&&&&注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字符串按宽字符保存-即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字符串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。同样,您还可以用下面的语句定义宽字符数组:static wchar_t a[] = L"Hello!" ;&&&&&&&该字符串也需要14个字节的储存空间,sizeof (a) 将返回14。索引数组a可得到单独的字符。a[1] 的值是宽字符「e」,或者0x0065。虽然看上去更像一个印刷符号,但第一个引号前面的L非常重要,并且在两个符号之间必须没有空格。只有带有L,编译器才知道您需要将字符串存为每个字符2字节。稍后,当我们看到使用宽字符串而不是变量定义时,您还会遇到第一个引号前面的L。幸运的是,如果忘记了包含L,C编译器通常会给提出警告或错误信息。您还可在单个字符文字前面使用L前缀,来表示它们应解释为宽字符。如下所示:wchar_t c = L'A' ;&&&&&&&但通常这是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。
阅读(...) 评论()

我要回帖

更多关于 k歌里怎样删除好友 的文章

 

随机推荐