UNICODE字符集
Unicode :宽字节字符集
1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?
可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2. 如何对DBCS(双字节字符集)字符串进行操作?
函数 描述
PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址
BOOL IsDBCSLeadByte( BYTE ); 如果该字节是DBCS字符的第一个字节,则返回非0值
3. 为什么要使用Unicode?
(1) 可以很容易地在不同语言之间进行数据交换。
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3) 提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成
Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结
果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序
更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数
Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何编写Unicode源代码?
Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用
Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows定义的Unicode数据类型有哪些?
数据类型 说明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
6. 如何对Unicode进行操作?
字符集 特性 实例
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。
Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集 实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 为什么应当尽量使用操作系统函数?
这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于
这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何编写符合ANSI和Unicode的应用程序?
(1) 将文本串视为字符数组,而不是chars数组或字节数组。
(2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4) 将TEXT宏用于原义字符和字符串。
(5) 执行全局性替换(例如用PTSTR替换PSTR)。
(6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传
递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来
分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
10. 如何对字符串进行有选择的比较?
通过调用CompareString来实现。
标志 含义
NORM_IGNORECASE 忽略字母的大小写
NORM_IGNOREKANATYPE 不区分平假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字符
NORM_IGNORESYMBOLS 忽略符号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT 将标点符号作为普通符号来处理
11. 如何判断一个文本文件是ANSI还是Unicode?
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。
12. 如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此
IsTextUnicode有可能返回不正确的结果。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
回复人: xtky_limi(痛在心中笑在脸上) (2001-12-22 0:35:58) 得0分
上面说的已经比较全了。
回复人: xtky_limi(痛在心中笑在脸上) (2001-12-22 0:38:13) 得0分
TEXT是宏
相当于L##
它可以根据编译环境确定为DBMS,还是UNICODE字符集
转载于:https://www.cnblogs.com/kevinzhwl/archive/2009/12/01/3878981.html
UNICODE字符集相关推荐
- 《windows核心编程系列》二谈谈ANSI和Unicode字符集
第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...
- Unicode字符集下WriteFile中文处理
最近在使用WriteFile函数时发现,vc2008中unicode字符集下处理中文乱码的一些解决方法,归纳如下 1. 写入的时候采用多字节char类型 HANDLE hFile;DWORD nByt ...
- unicode 字符集环境下的mfc 读写 ini 配置文件的_WSL:在Windows下优雅地玩Linux
本文作者:刘观宇,360 奇舞团高级前端工程师.技术经理,W3C CSS工作组成员. 引子 一直以来,Windows的命令行的体验都不是特别的友好.由于Windows以图形界面交互为主,同时微软在一段 ...
- 【转】刨根究底字符编码之十——Unicode字符集的字符编码方式
一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中),有些字符的编号(即码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两 ...
- 9.关于Unicode字符集
原文链接:http://blog.csdn.net/yang3wei/article/details/47414483 点击阅读原文 --------------------------------- ...
- 计算机系统-Unicode字符集与它包含的UTF-8解决方案
Unicode字符集最早要求每个字符占4个字节,这用英语和阿拉伯语的国家能同意吗?他们肯定不同意,4个字节太大了,但是类似中文韩语日语这些,1个2个字节还放不下,这就提出了Unicode字符集下的UT ...
- 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 让Unicode字符集少添麻烦
从VC6.0入门的初学者在使用VS2008的时候,往往会遇到VS2008默认使用Unicode字符集带来的麻烦 .比如说,在生成解决方案的时候,经常会遇到以下提示: 无法从"char [9] ...
- 关于Unicode字符集,将char数组转化成LPCTSTR
解决方法 不适用spritf,而是使用wsprintf 1.可变参数: 标准版 sprintf swprintf _stprintf 最大长度版 _snprintf _snwprintf _sntpr ...
最新文章
- All About Monads
- vs中没有fstream_vs++2010 编译说找不到 fstream.h 解决方法
- IntelliJ IDEA开发工具安装Scala插件使用
- 求正整数的阶乘 c语言,求10000的阶乘(c语言代码实现)
- mysql dsec_MySql数据库操作命令
- Android Studio升级到3.0,抛出Aapt2Exception异常
- 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 2、Practice Questions...
- 物联卡与sim卡有什么差别性的不同
- mysqldump备份所有数据库,恢复单个库的场景预演
- android app唯一标识符,android 唯一识别码笔记
- 控制算法(二)—— 模糊控制算法
- 小猿圈web分享-一个web全栈工程师的面试总结
- NET 常见网络命令
- 艺术字体手绘,如何进行创作呢
- Eclipse三种文件目录folder,source folder,package的关系及Build Path的作用
- 日程安排(多重继承+重载)
- NIO和BIO的比较
- 公司网页服务器访问超时,网站页面请求后台超时的相关咨询
- 不愧是阿里P8!java如何遍历链表
- 我的戴尔笔记本E6440官网下载地址
热门文章
- 使用springboot集成jseesite
- Eclipse断点调试
- mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap...
- Servlet读取文件的最好的方式
- atitit.spring hibernate的事务机制 spring不能保存对象的解决
- CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)...
- 【年少的风】C#小学生算式×××2
- 使用数据库的压测工具super-smack测试mysql数据库性能
- 柠檬工会_工会经营者
- leetcode64. 最小路径和(dp)