博文

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是不抛出异常的,所以很多人就完全忽略这样的错误了,只是在程序执行完后才发现自己什么都没有得到。......

阅读全文(2076) | 评论:0

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字符串的地方,如第三方类库的接口,仍可......

阅读全文(1681) | 评论:0

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;
}......

阅读全文(3020) | 评论:0