关于_UNICODE编码使用TCHAR和char的问题

hctxx 2011-09-01 04:03:38
两者之间如何转换。比如说正常定义的set集合都用
char*的情况下查找中文字节


main()
{
set<char*> cSec;
cSec.insert("中国人");
cSec.insert("美国人");
cSec.insert("英国人");

set<char*>::iterator set_it = cSec.find("中国人");
cout << *set_it << endl;
}

这样的话可以正常的查找到并且输出。由于我需要的令一个程序现在出现了
需要将char*全部换成是TCHAR的情况
现在想咨询下大牛们,如何将char*更换为TCHAR来实现与此相同的功能,
顺便请教下。他们两个之间的转换该如何实现。
我是新人请大家多多指教。。谢谢
...全文
923 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
hctxx 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 gisupc 的回复:]

引用 31 楼 hctxx 的回复:

引用 28 楼 jackyjkchen 的回复:

勉强在UNICODE和非UNICODE下都能用(取决于是否定义_UNICODE)

极其蛋疼

C/C++ code

#include <set>
#include <iostream>
using namespace std;

#ifdef _UNICODE
#defi……
[/Quote]

恩,您好。之前的程序是在linux下编译的。TCHAR是已经定义好的。
gisupc 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 hctxx 的回复:]

引用 28 楼 jackyjkchen 的回复:

勉强在UNICODE和非UNICODE下都能用(取决于是否定义_UNICODE)

极其蛋疼

C/C++ code

#include <set>
#include <iostream>
using namespace std;

#ifdef _UNICODE
#define _T(x) L ## x
typed……
[/Quote]
给出TCHAR定义!
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jackyjkchen 的回复:]

勉强在UNICODE和非UNICODE下都能用(取决于是否定义_UNICODE)

极其蛋疼

C/C++ code

#include <set>
#include <iostream>
using namespace std;

#ifdef _UNICODE
#define _T(x) L ## x
typedef wchar_t TCHAR;
#define tcout wco……
[/Quote]



您好,之前有点部好意思哈。。我有点理解错误了。。
之前所做的系统已经自定义了TCHAR

还得麻烦您下
十八道胡同 2011-09-01
  • 打赏
  • 举报
回复
搜一下TCHAR,_T的用法就知道的差不多了
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jackyjkchen 的回复:]

勉强在UNICODE和非UNICODE下都能用(取决于是否定义_UNICODE)

极其蛋疼

C/C++ code

#include <set>
#include <iostream>
using namespace std;

#ifdef _UNICODE
#define _T(x) L ## x
typedef wchar_t TCHAR;
#define tcout wco……
[/Quote]


非常感谢。。万分感激
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
勉强在UNICODE和非UNICODE下都能用(取决于是否定义_UNICODE)

极其蛋疼


#include <set>
#include <iostream>
using namespace std;

#ifdef _UNICODE
#define _T(x) L ## x
typedef wchar_t TCHAR;
#define tcout wcout
#else
#define _T(x) x
#define tcout cout
typedef char TCHAR;
#endif

int main()
{
setlocale(LC_ALL, "");
set<const TCHAR*> cSec;
cSec.insert(_T("中国人"));
cSec.insert(_T("美国人"));
cSec.insert(_T("英国人"));

set<const TCHAR*>::iterator set_it = cSec.find(_T("中国人"));
tcout << *set_it << endl;
getchar();
}

hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 jackyjkchen 的回复:]

引用 21 楼 hctxx 的回复:

引用 20 楼 jackyjkchen 的回复:

引用 18 楼 hctxx 的回复:

引用 17 楼 jackyjkchen 的回复:

引用 9 楼 hctxx 的回复:

引用 3 楼 jackyjkchen 的回复:

char *换TCHAR*
明文字符串引号外面罩上_T()

TCHAR是M$的东东,用它在Wi……
[/Quote]


恩。谢谢你。这个行不通就换个方式我再尝试下,先研究WINDOWS下的弄好的吧。。
还是谢谢你~!
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hctxx 的回复:]

引用 22 楼 jackyjkchen 的回复:

楼主在熟悉Win API编程之前,这个问题是不可能明白的,不懂得东西就要绕过,OK?


恩,OK,不过这是师傅布置的任务,所以搞的头晕也没想明白。。。
[/Quote]
如果您师傅要求您在Linux下用TCHAR还要用C++标准库是强人所难……

不是不可以做到,而是难度太大而难以做到完美
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 hctxx 的回复:]

引用 20 楼 jackyjkchen 的回复:

引用 18 楼 hctxx 的回复:

引用 17 楼 jackyjkchen 的回复:

引用 9 楼 hctxx 的回复:

引用 3 楼 jackyjkchen 的回复:

char *换TCHAR*
明文字符串引号外面罩上_T()

TCHAR是M$的东东,用它在Windows API和MFC中很方便,但不跨平……
[/Quote]

我说过了,只要你想用TCHAR,C++标准库所有和字符串相关的东西全要重定义!

楼主既然心很大,要在Linux下兼容,最好的办法就是不用unicode,char*兼容性最好

TCHAR不可能在Linux下完全兼容,我这么跟你说吧,不光是M$那一大堆双版本函数的问题,而且unicode环境下TCHAR==wchar_t,这个wchar_t在VC和gcc下连字长都不一样,Qt等使用UTF16的跨平台库都是使用unsigned short存储字符的!

楼主的需求——无解
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jackyjkchen 的回复:]

楼主在熟悉Win API编程之前,这个问题是不可能明白的,不懂得东西就要绕过,OK?
[/Quote]

恩,OK,不过这是师傅布置的任务,所以搞的头晕也没想明白。。。
joen900 2011-09-01
  • 打赏
  • 举报
回复
goof
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
楼主在熟悉Win API编程之前,这个问题是不可能明白的,不懂得东西就要绕过,OK?
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jackyjkchen 的回复:]

引用 18 楼 hctxx 的回复:

引用 17 楼 jackyjkchen 的回复:

引用 9 楼 hctxx 的回复:

引用 3 楼 jackyjkchen 的回复:

char *换TCHAR*
明文字符串引号外面罩上_T()

TCHAR是M$的东东,用它在Windows API和MFC中很方便,但不跨平台了,STL的作用也就退化为一个方便的容器

如果仅……
[/Quote]


哦...对于cout之类的就是想在本地看一下。输出看看是否可以正常。
因为之前的程序需要在linux下进行查找。但是涉及到TCHAR和char*.
而要查找的内容又包含汉字。不知道该如何实现更改下可以解决这样的问题呢
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hctxx 的回复:]

引用 17 楼 jackyjkchen 的回复:

引用 9 楼 hctxx 的回复:

引用 3 楼 jackyjkchen 的回复:

char *换TCHAR*
明文字符串引号外面罩上_T()

TCHAR是M$的东东,用它在Windows API和MFC中很方便,但不跨平台了,STL的作用也就退化为一个方便的容器

如果仅仅是要国际化,干脆统一用UTF8或加 L 转……
[/Quote]

哎,如果用wchar_t(相当于TCHAR在unicode环境下),你连cout也不能用!得用wcout

换句话说,你得为了配合M$搞出来的那个TCHAR,学习15那样,给cout和wcout也弄一个tcout,给string和wstring也弄一个tstring…………

你觉得有必要么

各种库有自己的配合性,硬要把不兼容的东西一起用是自己找罪受,Windows API和STL风格相冲,根本搞不到一块去
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 luciferisnotsatan 的回复:]

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
[/Quote]

我按照您给的#ifdef加上了。。可是依然不行啊。
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jackyjkchen 的回复:]

引用 9 楼 hctxx 的回复:

引用 3 楼 jackyjkchen 的回复:

char *换TCHAR*
明文字符串引号外面罩上_T()

TCHAR是M$的东东,用它在Windows API和MFC中很方便,但不跨平台了,STL的作用也就退化为一个方便的容器

如果仅仅是要国际化,干脆统一用UTF8或加 L 转成UTF16


就是想换了之后再linux下可以……
[/Quote]

哦。我刚刚接触这个。不太懂怎么实现和配置啊。您能说下具体我该怎么实现吗,
比如楼上的兄弟们说的。_T(),头文件。#define我都加上了。
但输出的结果仍然为一个地址哦
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hctxx 的回复:]

引用 3 楼 jackyjkchen 的回复:

char *换TCHAR*
明文字符串引号外面罩上_T()

TCHAR是M$的东东,用它在Windows API和MFC中很方便,但不跨平台了,STL的作用也就退化为一个方便的容器

如果仅仅是要国际化,干脆统一用UTF8或加 L 转成UTF16


就是想换了之后再linux下可以用
[/Quote]
Linux推荐UTF8,Linux对UTF16的支持很差

而且TCHAR的主要作用就是匹配“双版本Windows API”,Linux下没这个需求!
hctxx 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 limang89 的回复:]

set<TCHAR*> cSec;
cSec.insert(L"中国人");
cSec.insert(L"美国人");
cSec.insert(L"英国人");

set<TCHA*>::iterator set_it = cSec.find(L"中国人");
cout << *set_it << endl;
[/Quote]

这个得到的不是我想要的结果啊。。。得到的结果是0114C81C这个值
与我想要的不符啊。
luciferisnotsatan 2011-09-01
  • 打赏
  • 举报
回复
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
jackyjkchen 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hctxx 的回复:]

引用 4 楼 limang89 的回复:

set<TCHAR*> cSec;
cSec.insert(L"中国人");
cSec.insert(L"美国人");
cSec.insert(L"英国人");

set<TCHA*>::iterator set_it = cSec.find(L"中国人");
cout << *set_it << endl;


1>c:\use……
[/Quote]
TCHAR一定要对用_T() 要加头文件tchar.h

wchar_t才对应L

TCHAR如果在ANSI工程下和char一样
如果在unicode工程下和wchar_t一样

楼主确定自己的工程属性
加载更多回复(13)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧