`
on069on
  • 浏览: 10602 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

 
阅读更多

  在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱。
  应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式,我们在编写程序的时候,最好能依据下面的准则来进行:
  基本准则:
  1.将文本字符串想象为字符数组,而非char或字节数组
  2.开始使用通用数据类型来表示文本字符和字符串(如TCHAR,PTSTR)
  原因是我们可以在WinNT.h的头文件中找到如下定义(代码有删改): #ifndef VOID #define VOID void typedef char CHAR; typedef short SHORT; typedef long LONG; typedef int INT; #endif #endif // // UNICODE (Wide Character) types // #ifndef _MAC typedef wchar_t WCHAR; // wc, 16-bit UNICODE character #else // some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char typedef unsigned short WCHAR; // wc, 16-bit UNICODE character #endif typedef WCHAR *PWCHAR, *LPWCH, *PWCH; typedef CONST WCHAR *LPCWCH, *PCWCH; typedef WCHAR *NWPSTR, *LPWSTR, *PWSTR; typedef PWSTR *PZPWSTR; typedef CONST PWSTR *PCZPWSTR; typedef WCHAR UNALIGNED *LPUWSTR, *PUWSTR; typedef CONST WCHAR *LPCWSTR, *PCWSTR; typedef PCWSTR *PZPCWSTR; typedef CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR; typedef CONST WCHAR *LPCWCHAR, *PCWCHAR; typedef CONST WCHAR UNALIGNED *LPCUWCHAR, *PCUWCHAR; // // UCS (Universal Character Set) types // typedef unsigned long UCSCHAR; #define UCSCHAR_INVALID_CHARACTER (0xffffffff) #define MIN_UCSCHAR (0) // // ANSI (Multi-byte Character) types // typedef CHAR *PCHAR, *LPCH, *PCH; typedef CONST CHAR *LPCCH, *PCCH; typedef CHAR *NPSTR, *LPSTR, *PSTR; typedef PSTR *PZPSTR; typedef CONST PSTR *PCZPSTR; typedef CONST CHAR *LPCSTR, *PCSTR; typedef PCSTR *PZPCSTR; // // Neutral ANSI/UNICODE types and macros // #ifdef UNICODE // r_winnt #ifndef _TCHAR_DEFINED typedef WCHAR TCHAR, *PTCHAR; typedef WCHAR TBYTE , *PTBYTE ; #define _TCHAR_DEFINED #endif /* !_TCHAR_DEFINED */ typedef LPWCH LPTCH, PTCH; typedef LPWSTR PTSTR, LPTSTR; typedef LPCWSTR PCTSTR, LPCTSTR; typedef LPUWSTR PUTSTR, LPUTSTR; typedef LPCUWSTR PCUTSTR, LPCUTSTR; typedef LPWSTR LP; #define __TEXT(quote) L##quote // r_winnt #else /* UNICODE */ // r_winnt #ifndef _TCHAR_DEFINED typedef char TCHAR, *PTCHAR; typedef unsigned char TBYTE , *PTBYTE ; #define _TCHAR_DEFINED #endif /* !_TCHAR_DEFINED */ typedef LPCH LPTCH, PTCH; typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR; typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR; #define __TEXT(quote) quote // r_winnt #endif /* UNICODE */ // r_winnt  3.用明确的数据类型来表示字节,字节指针和数据缓冲区(如BYTE, PBYTE)原因如上同
  4.使用TEXT或是_T来表示字面量字符和字符串(这两个宏会根据你自己设置的字符集属性,动态转换成相应的字符集)
  5.执行全局替换,原因同2.
  6.修改与字符串有关的计算。如有些函数需要我们传入缓冲区大小的字符数,这个时候就需要_countof(szBuffer),而不是sizeof(szBuffer);
  有些时候我们需要为一个字符串分配内存,那么内存是使用字节数来分配的,这个时候我们就需要使用malloc(nCharacters*sizeof(TCHAR)),而不是使用malloc(nCharacters).
  我们可以使用如下样式的宏来处理这个问题:     #define chmalloc(nCharacters) (TCHAR*)malloc(nCharacters*sizeof(TCHAR)) 7.尽量避免使用printf系列的函数,尤其是有%s,%S字段类型来进行ANSI和Unicode字符串之间的相互转换。正确的做法是使用MultiByteToWideChar和WideCharToMultiByte函数
  8.对于UNICODE和_UNICODE,要么都定义,要么都不要用,因为VS会在我们创建项目的时候默认定义_UNICODE。
  9.使用安全的字符串函数,如后缀为_s的函数或是前缀为StringCch的函数,后者会截断字符串。前者需指定字符串长度。
  10.使用/GS 和/RTCS编译器选项来自动检测缓冲区溢出。
  使用UNICODE编码规范是一种好的编程习惯,但是,有的时候,我们不得不使用ANSI编码方式,这种情况该如何处理呢?
  请看下集UNICODE和ANSI字符串的转换 《 让你的程序更加适用--使用ANSI和UNICODE导出函数》 
分享到:
评论

相关推荐

    C语言UTF8到ANSI和Unicode转换代码

    使用C语言,实现UTF8、Unicode、ANSI字符集的互转,用C语言实现头文件和源文件,引入工程可以直接使用。如果在MFC项目中使用该代码,需要更改配置,压缩包中有详细说明。

    众多字符集编码的区别Unicode向GB2312转换方法说明及示例

    众多字符集编码的区别Unicode向GB2312转换方法说明及包括ASCII码部分及GB2312字符集。 ASCII码部分为128个字符,GB2312字符集为7445个字符。 ASCII码部分不需要用映射表。 GB2312 table可分为4段,每段都是连续的。...

    UTF8,ANSI,UTF7,UNICODE,UTF32等字符集字符串与字节数组互转工具

    UTF8,ANSI,UTF7,UNICODE,UTF32等字符集字符串与字节数组互转工具,方便调试学习

    VC++的Unicode编程.doc

    如果调用一个API函数并给它传递一个ANSI(ASCII字符集以及由此派生并兼容的字符集,如:GB2312,通常称为ANSI字符集)字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。...

    让开源项目TinyXml支持Unicode(wchar_t)

    2. TinyXml函数提供的Xml内容解析功能,仅支持以ANSI编码和UTF8编码的Xml字符串,也即`多字节编码`。 3. TinyXml函数提供的Xml内容解析功能,不支持内容以UTF16编码和UTF32编码的Xml字符串,也即`Unicode编码`。 4...

    Visual C++.NET中的字符串转换方法.doc

    Visual C++.net涉及到ATL/ATL Server、MFC和托管C++...之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。  那么什么是BSTR、LPSTR以及LPWSTR呢?

    C++字符串操作经验集

    lchar,wchar_t,CHAR,BYTE,UCHAR,WCHAR,TCHAR,TBYTE char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。 wchar_t是char的Unicode版本。...本文档介绍C++字符串操作经验

    命令行中用VBS实现本文文件编码互换

    终于找到了,之前有发过只能ANSI编码转Unicode编码,这次是多个工具合集,包括CMD环境中用命令方式实现ANSI编码文本文件转为Unicode、Unicode转ANSI……呵呵太好了!

    VC++6.0核心编程源码.rar

    当然,你首先必须自己转换字符串,然后将已转换的消息表资源嵌入你的.exe文件或DLL模块,不过,这时该函数会选定正确的嵌入对象。ErrorShow示例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将...

    UTF8与Unicode转换类

    全面实现Ansi、Unicode、UTF8字符串之间的转换

    MySql 5.1 参考手册.chm

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    Qt中QString转换成const char * ()、QByteArray等方法

    QString类提供Unicode字符串。 QString存储一个16位QChars字符串,其中每个QChar对应一个Unicode 4.0字符。(代码值大于65535的Unicode字符使用代理项对(即两个连续的QChars)存储。) Unicode是一个国际标准,它...

    易语言搜索特定字符

    易语言搜索特定字符源码,搜索特定字符,格式化目录,遍历目录,处理文件,快速字节集转大写,插入新行,取文件目录,显示结果,子程序1,标题处理子程序,引出子程序,读取子程序,超级列表框排序,二分查找,处理子程序,Base64...

    编译好的 jsoncpp 三方库(附完整的头文件、源文件)

    JSONCPP支持标准的JSON语法,并且支持Unicode字符集和ANSI字符集。 JSONCPP可以将JSON格式的文本转换为C++对象,也可以将C++对象转换为JSON格式的文本。这个库提供了一个JsonValue类,它代表了一个JSON值。Json...

    winhex 16进制文件转换器 要的赶紧下

    包括 ASCII、16 进制数据 - 可进行 2 进制、16 进制 ASCII, Intel 16 进制, 和 Motorola S 转换 - 字符集: ANSI ASCII, IBM ASCII, EBCDIC, (Unicode) - 立即窗口切换、打印、生成随机数字 - 支持打开大于 4 GB 的...

    易语言取千千音乐歌词

    易语言取千千音乐歌词源码,取千千音乐歌词,播放MP3歌曲,编码_Ansi到Unicode,替换特殊字符,查看字节集,到十六进制文本,HTT读取网页,转换编码,取文本中间数组,code,高级截取文本,编码_gb2312到utf8,Unicode到Ansi,Ansi...

    MySQL 5.1中文手冊

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    MySQL 5.1参考手册 (中文版)

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    mysql官方中文参考手册

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 ...

    MYSQL中文手册

    10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果...

Global site tag (gtag.js) - Google Analytics