ANSI 和 UNICODE 的函数对应表

摘要:
WC_ ERR_ INVALID_ CHARS此选项将导致函数在遇到无效字符时无法返回,GetLastError将返回错误代码error_ NO_ UNICODE_ TRANSLATION否则,该函数将自动丢弃非法字符。当指定WC时_当COMPOSITEECECK时,函数将将复合字符转换为预制字符。5022050221502525022525052750229529365493657002到570116000042对于UTF8,dwFlags必须为0或WC_ ERR_ INVALID_ CHARS,否则函数将无法返回并设置错误代码error_ INVALID FLAGS,您可以调用GetLastError获取它。如果此参数用于要求此参数为空的dwFlags,则函数将无法返回并设置错误代码error_ INVALID_parameterLpDefaultChar和lpUsedDefaultChar都设置为NULL,因此函数将更快。

ANSI        UNICODE           通用
(char.h)    (wchar.h)        (tchar.h)

char         wchar_t          TCHAR
char *       wchar_t *        PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)

printf       wprintf         _tprintf
scanf       wscanf           _tscanf

atoi         _wtoi           _ttoi
atol         _wtol           _ttol
itoa         _itow           _itot
ltoa         _ltow           _ltot

atof         _wtof           _tstof

strlen       wcslen          _tcslen
strcat       wcscat          _tcscat
strcpy      wcscpy           _tcscpy
strcmp     wcscmp            _tcscmp

补充:

宽字符 和 字符 转换
char to  wchar:
mbstowcs( 
wchar_t* wcstr, 
const char* mbstr, 
size_t count 
); 
wchar to char:
size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );

第一个就是宽字符到多字节字符转换函数,函数原型如下: 
int WideCharToMultiByte( 
UINT CodePage, 
DWORD dwFlags, 
LPCWSTR lpWideCharStr, 
int cchWideChar, 
LPSTR lpMultiByteStr, 
int cbMultiByte, 
LPCSTR lpDefaultChar, 
LPBOOL lpUsedDefaultChar 
);

此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数: 
CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。 
CP_ACP 当前系统ANSI代码页 
CP_MACCP 当前系统Macintosh代码页 
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码 
CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么 
CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么 
CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 
CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 
我想最常用的应该是CP_ACP和 CP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8。 
dwFlags: 指定如何处理没有转换的字符, 但不设此参数函数会运行的更快一些,我都是把它设为0。 可设的值如下表所示: 
WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。也就是说,如果把Unicode转换成多字节字 符,然后再转换回来,你并不一定得到相同的Unicode字符,因为这期间可能使用了默认字符。此选项可以单独使用,也可以和其他选项一起使用。 
WC_COMPOSITECHECK 把合成字符转换成预制的字符。它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。 
WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。否则函 数会自动丢弃非法字符。此选项只能用于UTF8。 
WC_DISCARDNS 转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用 
WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用 
WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如'?'),与WC_COMPOSITECHECK一起使用。 
当指定 WC_COMPOSITECHECK时,函数会将合成字符转换成预制字符。合成字符由一个基字符和一个不占空间的字符(如欧洲国家及汉语拼音的音标)组 成,每一个都有不同的字符值。预制字符有一个用于表示基字符和不占空间字符的合成体的单一的字符值。 
当指定WC_COMPOSITECHECK 选项时,也可以使用上表列出的最后3个选项来定制预制字符的转换规则。这些选项决定了函数在遇到宽字符串的合成字符没有对应的预制字符时的行为,他们与 WC_COMPOSITECHECK一起使用,如果都没有指定,函数默认WC_SEPCHARS。 
对于下列代码页,dwFlags必须为0,否 则函数返回错误码ERROR_INVALID_FLAGS。 
50220 50221 50222 50225 50227 50229 52936 54936 57002到57011 65000(UTF7) 42(Symbol) 
对于UTF8,dwFlags必须为0或 WC_ERR_INVALID_CHARS,否则函数都将失败返回并设置错误码ERROR_INVALID_FLAGS,你可以调用 GetLastError获得。

lpWideCharStr: 待转换的宽字符串。 
cchWideChar: 待转换宽字符串的长度,-1表示转换到字符串结尾。 
lpMultiByteStr: 接收转换后输出新串的缓冲区。 
cbMultiByte: 输出缓冲区大小,如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr。 
lpDefaultChar: 指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。 如果为NULL则使用系统默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码 ERROR_INVALID_PARAMETER。 
lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。对于要 求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。 lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。 
返回值: 如果函数成功,且cbMultiByte非0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null);cbMultiByte为 0,则返回转换所需字节数。函数失败,返回0。 
注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会 很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为 了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所 需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区,详见下面的代码。另外,从Unicode UTF16向非Unicode字符集转换可能会导致数据丢失,因为该字符集可能无法找到表示特定Unicode数据的字符。

wchar_t* pwszUnicode = "Holle, word! 你好,中国! "; 
int iSize; 
char* pszMultiByte;

iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); 
pszMultiByte = (char*)malloc((iSize+1)/**sizeof(char)*/); 
WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);

第二个是多字节字符到宽字符转换函数,函数原型如下: 
int MultiByteToWideChar( 
UINT CodePage, 
DWORD dwFlags, 
LPCSTR lpMultiByteStr, 
int cbMultiByte, 
LPWSTR lpWideCharStr, 
int cchWideChar 
);

此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。 
此函数的参数,返回值及注意事项参见上面函 数WideCharToMultiByte的说明,这里只对dwFlags做简单解释。 
dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。 
MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用 MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式 
MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符 
MB_USEGLYPHCHARS 使用像形字符代替控制字符 
对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。 
50220 50221 50222 50225 50227 50229 52936 54936 57002到57011 65000(UTF7) 42(Symbol) 
对于UTF8,dwFlags必须为0或MB_ERR_INVALID_CHARS,否则函数都将失败并返回错误码 ERROR_INVALID_FLAGS。 
以下函数我没用过,只简要说明之。 
int GetTextCharset( HDC hdc ); 
此函数获取当前选进的设备描述表的字符集,等同于GetTextCharsetInfo(hdc, NULL, 0)。 
返 回值: 成功返回字符集标识,失败返回DEFAULT_CHARSET。

unicode相关函数参考:http://blog.sina.com.cn/s/blog_61ce33b301014zj1.html

免责声明:文章转载自《ANSI 和 UNICODE 的函数对应表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java- WatchService监控Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle之字符集查看及其修改(转载)

当我们往表插入一些极限值的时候,比如一个title字段varchar(200) 标题的文字比如为101个字符的时候,就需要判断是否是16位的还是32位的了 一、什么是Oracle字符集        Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据...

使用 Windows 窗体 TextBox 控件创建密码文本框

密码框是一种 Windows 窗体文本框,它在用户键入字符串时显示占位符。 创建密码文本框 将 TextBox 控件的 PasswordChar 属性设置为某个特定字符。 PasswordChar 属性指定在文本框中显示的字符。 例如,如果希望在密码框中显示星号,请在“属性”窗口中将 PasswordChar 属性指定为“*”。 然后,无论用户...

Excel中,从字符串中截取指定字符

情况一:提取字符串中的数字 目标:提取C列的全部数字 方法一:Excel中的FIND函数+MID函数   方法:想要从指定位置截取,用到MID函数。因为right和left函数都是从第一个字符或者最后一个字符开始截取,不适合。     MID语法:MID(字符串,截取开始位置,返回字符的个数)     因为截取的开始位置不统一,但是要截取的数字前面都有#...

oracle正则表达式函数 匹配

文章介绍了关于oracle正则函数的一些用法,包括匹配等,Oracle10g提供了在查询中使用正则表达的功能,它是通过各种支持正则表达式的函数在where子句中实现的。 ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SU...

[转载]Unicode中对中文字符的编码

以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围。 本次研究的unicode对象是unicode 5.2.0版本。现在最新的是6.0版 对于这次研究的unicode把编码分为以下几个平面(英文中是plane,可以认为就是不同的区位) Unico...

linux基础知识-23

一、常识 (一) 文件 linux中将每个进程上下文之外需要保存的信息保存在文件中。linux采用简单模式保存信息,即信息以单一字节序列从头保存到尾。 序列的字节长度就是文件的长度。 文件中保存了什么?文本信息,图片信息,二进制信息等。 (二) 字节 8个位为一组,称为字节。即一个字节包含8个比特(bit)。每个bit值域{0,1},8位一共可以有2^8个...