unicode的编程问题

zw_2046 2008-04-08 11:36:07
编写UNICODE的程序,执行简单的字符串连接处理,可是好像不能打印,并且从内存中看,单个字符似乎仅占用一个字节的内存,还请大家帮我看看!
源码如下:
/***********************************/
/* test1.c */
/***********************************/

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <ShlWApi.h>

int main()
{
TCHAR stra[20];
LPTSTR pstrb = NULL;

stra[0] = _TEXT('A');
stra[1] = _TEXT('B');
stra[2] = _TEXT('C');
stra[3] = _TEXT('D');
stra[4] = _TEXT('\0');

//LPTSTR pstra = _TEXT("ABCD");
pstrb = TEXT("abc");
StrCat((LPTSTR)stra, pstrb);
//_tprintf(TEXT("string after cat: %s\n"), (LPTSTR)stra);
_tprintf("string after cat: %s\n", (LPCTSTR)stra);
return 0;
}


运行时,不能打印出来(但是取_MBCS宏或者ANSI时,都能够正确的打印出来预期结果:ABCDabc),而从内存窗口中看,stra
的数据为41 42 43 44 61 62 63 00 ,每个字符仅占一个字节空间,而UNICODE定义是两个字节表示一个字符啊。还请高手不吝赐教!
...全文
97 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zw_2046 2008-04-10
基本上了解了,谢谢大家!
回复
scq2099yt 2008-04-09
UNICODE设置问题
回复
erdgzw 2008-04-09
_UNICODE是控制台运行环境的宏
UNICODE是Windows运行环境的宏
UNICODE字符串在内存中应占两个字节,高位一般为00,在内存中的形式为先低后高。
回复
zaodt 2008-04-08

“而从内存窗口中看,stra
的数据为41 42 43 44 61 62 63 00 ,每个字符仅占一个字节空间”


上面这几话表明,你的工程不是 UNICODE 工程。
回复
Treazy 2008-04-08
主要是因为TCHAR这个类型是个与宏定义相关的

也就是在如果在UNICODE下
它就是wchar_t,

但是如果在MBCS下
它就是char

显然你看到的是MBCS下的

你把编译环境参数改成使用UNICODE就可以实现了
回复
zw_2046 2008-04-08
原来5楼的也是正解,可是正常运行了,仍然发现内存中的字符仅占用一个字节的空间,有知道的吗?
回复
zw_2046 2008-04-08
8楼的,用你的代码可以正常运行的,通过仔细比较,发现无非是你在代码中加了一个UNICODE宏,能解释一下这样做的原因吗?为什么_UNICODE与UNICODE都须要定义呢?谢谢了!
回复
gomoku 2008-04-08
既然你要编写UNICODE的程序,那么你就:


#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <strsafe.h>

void main()
{
WCHAR stra[20] = {'A','B','C', 'D'};
LPWSTR pstrb = L"abc";

StringCbCatW(stra, sizeof(stra), pstrb);
wprintf( L"string after cat: %s\n", stra );
}


L"" 告诉编译器它是一个UNICODE字符串。
回复
erdgzw 2008-04-08
如果你已定义UNICODE宏你应该这样赋值
stra[0] = 'A';
stra[1] = 'B';
stra[2] = 'C';
stra[3] = 'D';
stra[4] = '\0';

回复
hastings 2008-04-08
#define UNICODE
#define _UNICODE
#include<typeinfo.h>
#include<windows.h>
#include<tchar.h>
#include<stdio.h>
int main()
{
printf("%s\n",typeid(TCHAR).name());
TCHAR stra[20];
LPTSTR pstrb = NULL;
stra[0] = TEXT('A');
stra[1] = TEXT('B');
stra[2] = TEXT('C');
stra[3] = TEXT('D');
stra[4] = TEXT('\0');
pstrb = TEXT("abc");
lstrcat(stra, pstrb);
_tprintf(TEXT("string after cat: %s\n"), stra);

return 0;
}
回复
zw_2046 2008-04-08
自己先顶一下吧,知道的朋友麻烦指教一下啊!
回复
zw_2046 2008-04-08
回5楼,还是不行!
回复
oakfire 2008-04-08
把UNICODE _UNICODE都加上
回复
zw_2046 2008-04-08
回1、3楼:我已经设置了_UNICODE宏,我指的就是这种情况!
回复
erdgzw 2008-04-08
#define UNICODE
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-08 11:36
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……