VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 380|回复: 1

VC++基础班-[3]Ansi与Unicode-续集

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-1-14 17:41:32 | 显示全部楼层 |阅读模式
◆ 字符串占用字节数:
● Ansi:
char szStr[] = "abc";
占用字节数求法:sizeof(szStr);

char *psz = "defgh";
占用字节数求法:strlen(psz)*sizeof(char);

● Unicode:
wchar_t szwStr[] = L"abc";
占用字节数求法:sizeof(szwStr);

wchar_t *pwsz = L"defgh";
占用字节数求法:wcslen(pwsz)*sizeof(wchar_t);

● 通用函数:
TCHAR szStr[] = _T("abc");
占用字节数求法:sizeof(szStr);

TCHAR *psz = _T("defgh");
占用字节数求法:_tcslen(psz)*sizeof(TCHAR);
=======================================================

● 转换用到的最根本的 API 函数:
WideCharToMultiByte 实现宽字节转换到窄字节
MultiByteToWideChar 实现窄字节转换到宽字节

WideCharToMultiByte 的代码页用来标记与新转换的字符串相关的代码页;
MultiByteToWideChar 的代码页用来标记与一个多字节字符串相关的代码页,

[1]、常用的代码页有 CP_ACP 和 CP_UTF8 两个:
使用 CP_ACP 代码页就实现了 ANSI 与 Unicode 之间的转换;--- 我们所用的!
使用 CP_UTF8 代码页就实现了 UTF-8 与 Unicode 之间的转换。

[2]、dwFlags 参数允许我们进行额外的控制,但是,一般情况下都不使用这个标志,直接传递 0 就行了。

[3]、lpDefaultChar和pfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。

● 两个转换函数的使用举例:
char *cctryWideCharToAnsi(wchar_t *pWideChar)
{
        if (!pWideChar) return NULL;
        char *pszBuf = NULL;
        int needBytes = WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, NULL, 0, NULL, NULL);
        if (needBytes > 0){
                pszBuf = new char[needBytes+1];
                ZeroMemory(pszBuf, (needBytes+1)*sizeof(char));
                WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, pszBuf, needBytes, NULL, NULL);
        }

        return pszBuf;
}

wchar_t *cctryAnsiCharToWide(char *pChar)
{
        if (!pChar) return NULL;
        wchar_t *pszBuf = NULL;
        int needWChar = MultiByteToWideChar(CP_ACP, 0, pChar, -1, NULL, 0);
        if (needWChar > 0){
                pszBuf = new wchar_t[needWChar+1];
                ZeroMemory(pszBuf, (needWChar+1)*sizeof(wchar_t));
                MultiByteToWideChar(CP_ACP, 0, pChar, -1, pszBuf, needWChar);
        }

        return pszBuf;
}

〓※※※〓 使用过后千万别忘记释放空间……

● A2W、W2A、T2A、T2W 宏的使用以及注意事项:
[1]、使用 alloca() 函数进行空间的申请,宏返回的地址空间是从栈上面申请的,那么以后就不必释放,这样就涉及到了一个作用域的问题,具体见MSDN,
大家可以简单的理解为“向下兼容”,给大家解释解释!
[2]、不要在一个函数的循环体中使用 A2W 等字符转换宏,可能引起栈溢出。
具体课参照这篇帖子:http://www.cctry.com/thread-17948-1-1.html
比如:
#include <atlconv.h>
void func()
{
    while(true)
    {
        {
            USES_CONVERSION;
            testFunc(A2W("abc"));
        }
    }
}


相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:http://www.cctry.com/thread-17282-1-1.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html




上一篇:VC++基础班-[2]Ansi与Unicode
下一篇:VC++基础班-[4]CString常用操作讲解

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

75_avatar_middle
在线会员 besteast 发表于 2018-1-14 18:44:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-20 13:39

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表