Windows 下处理 ANSI 与 Unicode 字符串的一些小技巧

1. 开始将文本字符串想象为字符的数组,而不是char或字节的数组。

2. 为文本字符和字符串使用泛型(比如TCHAR/PTSTR)。

3. 为字节、字节指针和数据缓冲区使用显式数据类型(BYTE和PBYTE) 。

4. 为literal字符和字符串使用TEXT或_T宏,但为了保持一致性和更好的可读性,请
  避免两者混用。

5. 执行全局替换。(例如,用PTSTR替换PSTR)。
6. 修改字符串算术问题。例如,函数经常希望你传给它缓冲区的字符数,而不是字节数。

这意味着你应该传入_countof(szBuffer),而不是sizeof(szBuffer)。

而且,如果需要为一个字符串分配一个内存块, 而且知道字符串中的字符数, 那么记住内存是以字节来分配的。

这意味着你必须调用malloc(nCharacters*sizeof(TCHAR)),而不是调用malloc(nCharacters)。

在前面列出的所有基本准则中, 这是最难记住的一条, 而且如果出错, 编译器不会提供任何警告或错误信息。
    所以,最好定义一个宏来避免犯错:

#define chmalloc(nCharacters) (TCHAR*)malloc(nCharacters * sizeof(TCHAR))

7. 避免使用printf系的函数, 尤其是不要用%s和%S字段类型来进行ANSI与字符串的相互转换。

正确的做法是使用 MultiByteToWideChar 和 WideCharToMultiByte 函数。

8.  UNICODE 和 _UNICODE 符号要么都指定,要么一个都不指定。

对于字符串处理函数, 有以下准则:

1. 始终使用安全的字符串处理函数,比如那些后缀为 _s 的,或者前缀为 StringCch 的。
    后者主要在你想明确控制截断的时候使用; 如果不想明确控制截断, 则首选前者。

2. 不要使用不安全的C运行库字符串处理函数。

一般情况下,你使用或实现的任何缓冲区处理例程都必须获取目标缓冲区的长度作为一个参数。
    C 运行库提供了一系列缓冲区处理替代函数,比如 memcpy_s,memmove_s,wmemcpy_s或wmemmove_s。

只要定义了 __STDC_WANT_SECURE_LIB__ 符号,所有这些方法都是可用的;CrtDefs.h默认定义了此符号。

所以,不要对 _STDC_WANT_SECURE_LIB__ 进行 undef。

3. 利用 /GS 和 /RTCs 编译器标志来自动检测缓冲区溢出。

4. 不要用 Kernel32 方法来进行字符串处理,比如 lstrcat 和 lstrcpy 。

5.  在我们的代码中,需要要比较两种字符串。其中,编程类的字符串包括文件名、路径、XML元素/属性以及注册表项/值等等。

对于这些字符串,应使用 CompareStringOrdinal 来进行比较。

因为它非常快,而且不会考虑用户的区域设置。这是完全合理的。

因为不管程序在世界上的什么地方运行,这种字符串都是不变的。

用户字符串则一般要在用户界面上显示。对于这些字符串,应使用 CompareString(Ex) 来比较。

因为在比较字符串的时候,它会考虑用户的区域设置。

时间: 2024-11-03 20:56:50

Windows 下处理 ANSI 与 Unicode 字符串的一些小技巧的相关文章

Ansi 与 Unicode 字符串类型的互相转换

WideCharToMultiByte 实现宽字节转换到窄字节MultiByteToWideChar 实现窄字节转换到宽字节 WideCharToMultiByte 的代码页用来标记与新转换的字符串相关的代码页:MultiByteToWideChar 的代码页用来标记与一个多字节字符串相关的代码页, [1].常用的代码页有 CP_ACP 和 CP_UTF8 两个: 使用 CP_ACP 代码页就实现了 ANSI 与 Unicode 之间的转换:--- 我们所用的!使用 CP_UTF8 代码页就实现

干货|微信小程序线上线下推广的方法和销售话术小技巧分享

一款小程序在被开发后,若想获得广泛的用户群体,就得靠一些巧妙地话术宣传和推广措施.那么问题来了,微信小程序推广和话术有哪些呢?具体要怎么操作?别着急,请听小编来跟大家一一道来. 小程序推销话术小技巧 1.有自信,说话有底气 销售人员在宣传小程序时,一定在客户面前要很自信地说话.不自信的话是缺乏说服力量的.有了自信以后,销售人员在讲话的尾语可以作清楚的.强劲的结束,由此给对方确实的信息.如"一定可以使您满意的".这样的话会让客户对你宣传的小程序产生一定的信心. 2.重复重要语句,加深在顾

iOS开发 字符串的转化 小技巧

/字典或者数组转化为nsstring NSArray *arr = [NSArray arrayWithObject:@"1"]; NSString *str = [arr JSONString];               //数组或者字典转化为json串 NSArray *arr1 = [str objectFromJSONString];     //json串转化为字典或者数组 NSData *data = [arr1 JSONData];                 /

java.text.MessageFormat格式化字符串时的小技巧

public static void main(String[] args) throws InterruptedException { MessageFormat form = new MessageFormat( "{2,date,yyyy-MM-dd HH:mm:ss.SSS} The disk \"{1}\" contains {0,number,#.##} file(s).{3}"); int fileCount = 1273273237; String

多字符集(ANSI)和UNICODE及字符串处理方式准则

在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式,我们在编写程序的时候,最好能依据下面的准则来进行: 基本准则: 1.将文本字符串想象为字符数组,而非char或字节数组 2.开始使用通用数据类型来表示文本字符和字符串(如TCHAR,PTSTR) 原因是我们可以在WinNT.h的头文件中找到如下定义(代码有删改): [cpp] view plain

Windows下Python字符串编码问题

Python语言实际上有三种字符串,通常意义的字符串(str),Unicode字符串(unicode)和抽象类basestring,其中basestring不可实例化. 在Windows系统下的CPython解释器输入代码: >>> st1 = '中文' >>> st1 '\xd6\xd0\xce\xc4' >>> type(st1) <type 'str'> >>> st2 = st1.decode('gbk') >

在文件夹下所有文件中查找字符串(linux/windows)

在linux下可以用 grep "String" filename.txt#字符串 文件名grep -r "String" /home/#递归查找目录下所有文件来查找单个文件或者目录下所有文件是否包含某个字符串 windows下同样可以实现类似功能 findstr可以完成这个工作. findstr /s /i "string" *.*上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中查找"string"这个字符串.

ANSI与Unicode的转换

最近遇到中文路径访问的问题,又重新学习了一遍ansi与Unicode的知识,博文记录下来以供后续参考. ANSI 编码 ANSI是一种字符代码,为使计算机支持更多语 言,通常使用0x80~0xFF 范围的2 个字节来表示1 个字符.不同的国家和地区制定了不同的标准,由此产生了GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准. 这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI 编码. 关于MBCS字符集(Multi Byte Character

Ansi,UTF8,Unicode,ASCII编码的差别

近日须要不同的编码,关于上述编码,一直迷迷糊糊,查了些资料,总算大致了解了,以下全是从网上搜来的: 1.  ASCII和Ansi编码    字符内码(charcter code)指的是用来代表字符的内码.读者在输入和存储文档时都要使用内码,内码分为     单字节内码 -- Single-Byte character sets (SBCS),能够支持256个字符编码.     双字节内码 -- Double-Byte character sets)(DBCS),能够支持65000个字符编码.前者