一直对Char与String之类的转换很头痛
#include<iostream>
#include<string>
using namespace std;
int main()
{
wchar_t a='李';
char b='b';
string str;
str=49390;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"str="<<str<<endl;
system("pause");
return 0;
}
我想初始化一个中文字符再输出,不用String,用Char或wchar_t怎样解决啊?用指针和数组也没所谓。
谢谢了!
Firefox不支持插代码的,上面只能硬贴上了。
[解决办法]
这样可以:
char b[3]= "李";
[解决办法]
宽字符前要加L
[解决办法]
类似的unicode的问题,我在论坛上见到不少,由于在实际的工作中,我碰巧这方面的问题遇到比较多,正好有些心得,因此,下面就wchar_t,UNICODE和VC,谈谈我的经验,做个小小的总结,有存疑之处还请指出。
首先有点需要说明一下:下文的windows都是指windows2000和windows xp,其他的windows我不熟悉,不敢乱下结论。
(1) wchar_t在windows下就是一个2字节的类型,vc6是typedef unsigned short过来的,vc2005是可以选择作为内建的类型,或者typedef过去。wchar_t在linux下面是4个字节的类型。
(2) 在windows的平台上,UNICODE指的是UTF-16的一个子集,所谓的BMP(Basic Multilingual Plane)。对于中文而言,BMP已经涵盖了绝大部分的常用字符。在linux平台上,不太清楚,不过32位的wchar_t已经可以表示UTF-32了,UTF-32基本上涵盖了世界上从古到今所有的字符集。
(3) 在cpp的源文件中,字符串前加L来表示这是个UNICODE的字符串,编译器将其转译成UNICODE字符串的形式,其用法和性质实质上跟char类型差不多的,并且,库函数大部分都有wchar_t和char的两个版本,win32 API也是如此。事实上在windows上,使用MBCS的API倒是慢一些,因为windows2000以上的内核是UNICODE的,调用MBCS版本的API将有个字符串的转换,然后再调用其unicode版本的api。
(4) _T,这是VC的一个宏,根据编译环境的设定,如果是UNICODE,则_T表示L,否则没什么影响。相应的,每个库函数包括win32 API都有个TCHAR的版本,比如:strcpy, wcscpy的TCHAR版本是_tcscpy。实际上这些都只是预定义的宏,根本不是实际的库函数,只是为了方便用户将程序编译成UNICODE或者MBCS的版本。因此在程序中,只要把字符串都定义为_T("xxx")的形式,所有的库函数都用TCHAR的版本,就可以方便得把程序编译成UNICODE版本的。
(5) wifstream和wofstream读入UNICODE的问题。很多人都发现这个问题了,VC6下的wifstream和wofstream根本只是简单的把char扩充或者压缩了一下,根本就不是UNICODE的读入读出(VC2005和gcc下如何不清楚)。这是因为wifstream深层有个codecvt,这个默认的facet仅仅是简简单单的干了那么些事情,没有做更深的处理,不知道P.J.老大设计的时候是疏忽了还是怎么的。幸好他提出了一个补救措施。可见我的另外一篇csdn上的文章:http://topic.csdn.net/u/20070704/13/c09e03e1-fe80-4224-9ee9-1f601d676e13.html
(6) MBCS和UNICODE之间的转换,1.利用API,见http://topic.csdn.net/u/20070914/14/32bdd6cd-fd38-46ca-a999-1855ab024c47.html 2.使用ICU,IBM的一个库,优点:很好的支持UNICODE标准,横跨多平台。当年我windows下写的程序很轻松就移到了linux平台。
(6) console模式下,wcout显示UNICODE中文的问题:
(i) 在简体中文的环境下,需要设置locale,wcout.imbue(locale("chs"));然后方能正确显示wchar_t类型的UNICODE中文串。
(ii) 在英文的环境下,我没有找到方法正常显示UNICODE中文字符,虽然同时候UNICODE的windows程序中文显示都没有问题。估计这是windows本身的问题,因为我在英文windows下,chcp 936都不成功。