博文
unicode问题(2008-08-23 18:55:00)
摘要:我不知道vc中所谓的unicode究竟指的是什么,我现在对这个概念很模糊。microsoft总是把unicode和宽字符集混用。如此推断,它应该指的是utf-16或者ucs-2?
其次便是win下locale的问题。它的locale当然不是zh_CN.GB2312这种。(我真是奇怪为什么当年ISO在制定locale相关函数的时候既然把locale的分类都规定了,为什么不把locale的具体名称也给个ISO规范出来呢?想想可怜的程序员,比如得写
#ifdef _WIN32
std::string locale="chs";
#else
std::string locale="zh_CN.GB2312";
#endif
My god!)
vc下如果locale忘记了设置(默认是"C")或者设置不当,那么atoi等函数不能使用,且宽字节的stream,例如std::wcout, std::wfstream都不能输出中文,一旦输出中文,这个stream的状态就会变成bad。而默认情况下stream是不抛出异常的,所以很多人就完全忽略这样的错误了,只是在程序执行完后才发现自己什么都没有得到。......
unicode编程(2008-08-23 18:47:00)
摘要:最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。
1. 添加 UNICODE 和 _UNICODE 预处理定义
位置:Project Settings -> C/C++ -> Preprocessor definitions
添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)
2. 使用宽字符相关类型,如:
char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR
3. 对字符串常量使用 _T() 宏
4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等
类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等
5. 将 Project Settings -> Link -> Output -> Entry Point 设为 wWinMainCRTSTartup
否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本
可在StdAfx.h中:
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif
然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等
7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:
CString s = _T("ABC");
ASSERT(s[0] == 'A');
8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可......
string to wstring?(2008-08-23 18:27:00)
摘要: unix下的汉字处理问题
如何把一个汉字作为一个字符来处理?在以前,似乎比较麻烦,因为一个汉字一向是由2个字符来表示的。比较汉字,往往变成了字符串的比较。
unicode出现之后,情况就好多了,每个汉字都有唯一的编码,从此汉字就可以作为单个字符来对待了。
stl提供了string类来处理字符串,但是针对的是单字节字符串。如果想处理汉字,可以选择wstring。用法和string完全相同,但是处理的是宽字符。
string到wstring之间的转换,似乎stl没有提供好的方法,所以还得用c的库函数来处理。
以下给出一段代码,演示在unix下面,处理汉字的方法
#include <iostream>
#include <string>
#include <list>
#include <stdlib.h>
#include <locale.h>
namespace std {} using namespace std;
int main()
{
int cnt;
wchar_t wcs[100], wc;
string myword="列表内容为:";
setlocale(LC_CTYPE, ""); //很重要,没有这一句,转换会失败
mbstowcs(wcs, myword.c_str(), 99);
wstring newword(wcs);
cout<<"string content is:"<<myword.c_str()<< endl;
cout<<"wstring size is:" <<newword.size()<<endl;
return 0;
}......