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将宽字符串转换成等价的多字节字符串。

转载于:https://www.cnblogs.com/frank110/archive/2010/03/30/1700805.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

状态压缩DP入门

什么是状压DP: 动态规划的状态有时候比较恶心,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。 典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。 动态规…

InitializingBean、@PostConstruct、@Bean(initMethod = “init“)和构造方法 执行优先级比较

InitializingBean 1、InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。 2、spring初始化bean的时候,如果bean实现了InitializingBean接…

Windows 7 镜像制作过程

首先准备两台电脑,一台作为样机,一台作为技术人员电脑,技术人员电脑安装了Windows AIK第一部分、系统安装配置1、安装Windows 7 操作系统,步骤略过2、启用Administrator,使用Administrator登陆,然后在控制面…

论文笔记——Deep Model Compression Distilling Knowledge from Noisy Teachers

论文地址:https://arxiv.org/abs/1610.09650 主要思想 这篇文章就是用teacher-student模型,用一个teacher模型来训练一个student模型,同时对teacher模型的输出结果加以噪声,然后来模拟多个teacher,这也是一种正则化的方…

mysql清空全表数据建议直接用truncate,效率上truncate远高于delete

如果是清空全表数据建议直接用truncate,效率上truncate远高于delete,应为truncate不走事务,不会锁表,也不会生产大量日志写入日志文件;truncate table table_name 后立刻释放磁盘空间,并重置auto_increment…

[你必须知道的css系列]第一回:丰富的利器终结篇:选择符的组合关系及选择符总结...

介绍了这么多选择符,其实选择符的使用最大的优势不是单枪匹马奋斗,而应该是针对不同的页面结构组合成各种方阵。其主要方式体现在针对性使用类选择符或者 ID选择符、选择符群组及选择符组合这3种方式。一、针对性使用类选择符或者 ID选择符主要作用于类选…

剑指offer之 旋转数组的最小数字

package Problem8; public class MinInReversingList { /* * 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}…

SQL中delete和update后加 Limit是个好习惯

在业务场景要求高的数据库中,对于单条删除和更新操作,在 delete 和 update 后面加 limit 1 绝对是个好习惯。比如,在删除执行中,第一条就命中了删除行,如果 SQL 中有 limit 1;这时就 return 了,…

一个javascript框架应有的功能

一个人学许多东西,不等于他会很多东西,学了也会忘的,学了也不等于会运用,这时我们应该整一个很复杂的东西出来,那么就知道自己到底去到什么程度。基于这样的理由,我开始搞框架了,像我群里面的许…

appcan UI

appcan UI 公共类 ([appcanUI框架地址:](http://newdocx.appcan.cn/UI/source) .ub {display: -webkit-box !important;display: box !important;position: relative; }.ub-rev {-webkit-box-direction: reverse;box-direction: reverse; }.ub-fh {width…

sql表字段类型尽量使用数值替代字符串类型

尽量使用数值替代字符串类型 比如性别(sex):0代表女,1代表男;数据库没有布尔类型, mysql 推荐使用 tinyint 1:因为引擎在处理查询和连接时会逐个比较字符串中每一个字符; 2:而对于数字型而言只…

问题步骤记录器——“懒教师”的好帮手

场景:电话响,接通电话,电话另一端:我的电脑又怎么怎么了,为什么我的***弄不出那样的效果?请问***要怎样操作?感悟:虽然不是大虾,但由于众多同学当中,我仍然靠…

问题账户需求分析

材料: 某大银行的一位银行卡办公室的收账经理Liz遇到了一个问题。她每周都收到一份过期未付款的账户名单。这份报告已经从两年前的250个账户增加到现在的1250个账户。为了确定那些严重拖欠债务的账户,Liz需要通读这份报告。严重拖欠债务的账户由几个不同…

SQL优化技巧使用varchar代替char

一:varchar 变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间; 二:char 按声明大小存储,不足补空格; 三:其次对于查询来说,在一个相对较小的字段内搜索&am…

显式调用构造函数产生的悲剧

昨天一个同学让我帮他调试程序,发现一个诡异的问题,明明一个类的私有成员被赋值了,但运行时却总是不定的值。仔细检查了好久,才发现原来他把构造函数当作普通函数进行了显式调用,结果产生了悲剧。将他的问题简单的抽象…

input输入框修改后自动跳到最后一个字符

<input class"m-form-control" onpaste"return false" placeholder"直播间名称" name"name" onkeyup"this.valuethis.value.replace(/[^\u4e00-\u9fa5|\u0000-\u00ff|\u3002|\uFF1F|\uFF01|\uff0c|\u3001|\uff1b|\uff1a|\u300…

CCNA配置试验之七 PPP中PAP和CHAP的验证

PPP支持NCPC&#xff08;网络控制协议&#xff09;和LCP&#xff08;链路控制协议&#xff09;PPP的验证方式分为PAP二次握手明文传输和CHAP三次握手密文传输。试验配置PAP和CHAP的验证&#xff1a;试验配置如下&#xff1a;R1&#xff08;CHAP&#xff09;Router>enRouter#…

sql优化批量插入性能提升

建议批量插入 批量提交 INSERT into book VALUES(5,"A"),(6,"B");多条提交 INSERT into book VALUES(5,"A"); INSERT into book VALUES(6,"B") 理由 默认新增SQL有事务控制&#xff0c;导致每条都需要事务开启和事务提交&#xff0…

2017.10.13java上机出现中的问题

此篇博文主要说明在这次上机中遇见的问题和解决方法。 实验一&#xff1a;计算机计算组合数 问题1&#xff1a;在递推的方法用杨辉三角计算中&#xff0c;我创建了二维数组&#xff0c;但二维数组的行和列数并不是m&#xff0c;而是m1&#xff0c;因为杨辉三角的第一行只有一个…

重装系统

终于重装了系统&#xff0c;装了几个软件还比较满意 一个没有广告的迅雷qq终于可以打开网页了完美解码可以硬解转载于:https://www.cnblogs.com/jetz/archive/2010/04/18/1714847.html