在我们编写程序的时候,使用最多的是字符串的处理,而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导出函数》
发表评论
-
Java 正则表达式
2012-07-06 09:46 531基本符号 . 表示任意一个字符 \s ... -
Android SDK Document 框架导读的翻译和注解[6]
2012-07-03 13:44 785Activating components: intent ... -
flash特效原理:标签云
2012-07-02 12:59 698其实标签云是一个比较常见的特效类,在wondefl里 ... -
Flash:Flash Player 安全性 全屏模式安全性(闷)
2012-07-02 12:59 1009Flash 嵌入HTML后全屏 ... -
ColorPicker 实例
2012-07-02 12:59 574flex/spark" xmlns:mx=&q ... -
As做缩略图
2012-07-02 12:59 535解决方案:使用内置的一个叫做ImageSnapShot的类 ... -
ItemRender---之使用ClassFactory生成渲染器
2012-07-02 12:59 624问题 你想在运行时修改List或DataGridCo ... -
PHP作为Flex程序的数据源
2012-07-01 10:32 562Adobe Flash Builder 4 简体中文正式版 ... -
FLEX之对象拷贝
2012-07-01 10:32 6261.如何使用ByteArray实现对Object执行复制: ... -
Flex + BlazeDS 学习笔记 (一) --- BlazeDS的功能原理及配置实例
2012-07-01 10:32 573BlazeDS Test Drive里面 ... -
The architecture of Flex and Java applications two (Flex 和 Java 应用程序架构 2)
2012-07-01 10:32 597Flex and Java application ... -
菜鸟系列之一:在ubuntu linux下搭建android开发
2012-07-01 10:32 771(说明:在ubuntu liunx ... -
flex 绑定资源
2012-06-30 16:56 705flex 绑定资源 2011年05月15日 Adobe ... -
flex之旅(二)
2012-06-30 16:56 473flex之旅(二) 2010年11月04日 第一章:旅途 ... -
flex之旅 (一)
2012-06-30 16:56 303flex之旅 (一) 2010年11月02日 前言:不为 ... -
创建flex组件
2012-06-30 16:56 502创建flex组件 2010年08月25日 现在,考虑一下 ...
相关推荐
使用C语言,实现UTF8、Unicode、ANSI字符集的互转,用C语言实现头文件和源文件,引入工程可以直接使用。如果在MFC项目中使用该代码,需要更改配置,压缩包中有详细说明。
众多字符集编码的区别Unicode向GB2312转换方法说明及包括ASCII码部分及GB2312字符集。 ASCII码部分为128个字符,GB2312字符集为7445个字符。 ASCII码部分不需要用映射表。 GB2312 table可分为4段,每段都是连续的。...
UTF8,ANSI,UTF7,UNICODE,UTF32等字符集字符串与字节数组互转工具,方便调试学习
如果调用一个API函数并给它传递一个ANSI(ASCII字符集以及由此派生并兼容的字符集,如:GB2312,通常称为ANSI字符集)字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。...
2. TinyXml函数提供的Xml内容解析功能,仅支持以ANSI编码和UTF8编码的Xml字符串,也即`多字节编码`。 3. TinyXml函数提供的Xml内容解析功能,不支持内容以UTF16编码和UTF32编码的Xml字符串,也即`Unicode编码`。 4...
Visual C++.net涉及到ATL/ATL Server、MFC和托管C++...之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。 那么什么是BSTR、LPSTR以及LPWSTR呢?
lchar,wchar_t,CHAR,BYTE,UCHAR,WCHAR,TCHAR,TBYTE char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。 wchar_t是char的Unicode版本。...本文档介绍C++字符串操作经验
终于找到了,之前有发过只能ANSI编码转Unicode编码,这次是多个工具合集,包括CMD环境中用命令方式实现ANSI编码文本文件转为Unicode、Unicode转ANSI……呵呵太好了!
当然,你首先必须自己转换字符串,然后将已转换的消息表资源嵌入你的.exe文件或DLL模块,不过,这时该函数会选定正确的嵌入对象。ErrorShow示例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将...
全面实现Ansi、Unicode、UTF8字符串之间的转换
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. 校对效果的示例 ...
QString类提供Unicode字符串。 QString存储一个16位QChars字符串,其中每个QChar对应一个Unicode 4.0字符。(代码值大于65535的Unicode字符使用代理项对(即两个连续的QChars)存储。) Unicode是一个国际标准,它...
易语言搜索特定字符源码,搜索特定字符,格式化目录,遍历目录,处理文件,快速字节集转大写,插入新行,取文件目录,显示结果,子程序1,标题处理子程序,引出子程序,读取子程序,超级列表框排序,二分查找,处理子程序,Base64...
JSONCPP支持标准的JSON语法,并且支持Unicode字符集和ANSI字符集。 JSONCPP可以将JSON格式的文本转换为C++对象,也可以将C++对象转换为JSON格式的文本。这个库提供了一个JsonValue类,它代表了一个JSON值。Json...
包括 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...
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. 校对效果的示例 ...
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. 校对效果的示例 ...
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. 校对效果的示例 ...
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. 校对效果...