woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

C++的三种字符编码方式

c++通常使用的是三种编码方式,分别是SBCS(single byte character set),MBCS(multi-byte characterset)Unicode字符集。SBCS是一个字节一个字符,MBCS是几个字节一个字符,可能是一个,两个,三个不等,但是实际上,绝大多数时候使用两个字节的,所以有时候看到DBCS(double-byte character set)代替MBCS也不奇怪;Unicode一律是两个字节编码。在windows nt内核中,API一律使用的是unicode编码,所以如果你在编写软件过程中使用非unicode编码方式,系统也会自动转换成unicode执行,然后返回的结构再转换为你使用的类型。单字节表示用charunicode使用wchar_t.我们是在单字节的光芒下成长起来的,一时间完全抛弃单字节未免难以接受,但是有些时候我们又不可避免的需要使用unicode字符集合,那么ms提供的解决办法是泳宏:TChar

我们看看他的定义:

#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

ok,一切问题都解决了,我们只需要定义UNICODE就一样使用wchar_t,是很方便。另外,在windowsCOM中使用的一律是unicode,但是MFC默认的确实MBCS,所以你用MFC写的类库如果放到了COM下,有些字符的格式化方式或者返回值错误的,原因就是com一律使用unicode,而unicode使用wchar_t('00')结尾,char却是使用'0'结尾的。一般情况下,普通字符需要加载_T宏才能正常运行,比如MFC中你写道S = "FSDFSDF",那么该类转到COM下,需要写S = _T("FSDFSDF");才可以。我们可以想象宏_TTCHAr的功能一样,如果使用UNICODE就自动在constant string前面加上L,否则就直接使用。

我们说一些小问题:

VC6生成的console application
int main(int argc, char* argv[])

VS C++ 2005生成的是

int _tmain(int argc, _TCHAR* argv[])

显然,用_tmain更好,why?

You can also use _tmain, which is defined in TCHAR.h. _tmain will resolve to main unless _UNICODE is defined, in which case _tmain will resolve to wmain.(http://msdn2.microsoft.com/en-us/library/6wd819wh.aspx#).

我们也会常常看到如下一些字符类型,

WCHAR wchar_t wchar_t
LPSTR zero-terminated string of char (char*) zero-terminated string of char (char*)
LPCSTR constant zero-terminated string of char (const char*) constant zero-terminated string of char (const char*)
LPWSTR zero-terminated Unicode string (wchar_t*) zero-terminated Unicode string (wchar_t*)
LPCWSTR constant zero-terminated Unicode string (const wchar_t*) constant zero-terminated Unicode string (const wchar_t*)
TCHAR char wchar_t
LPTSTR zero-terminated string of TCHAR (TCHAR*) zero-terminated string of TCHAR (TCHAR*)
LPCTSTR constant zero-terminated string of TCHAR (const TCHAR*) constant zero-terminated string of TCHAR (const TCHAR*)
C
一般代表constantP代表指针,LP代表长指针,W代表宽字符,也就是UNICODE,这下是不是都能明白这些是干什么的了?

我们也会常常看到_mbsstr()这样的函数,这就是MBCS字符编码的函数,当然可以处理SBCS编码,但是反之却不行。所以为了保险起见,我们可以使用_mbsstr代替strstr,但是如果程序只是处理SBCS,那么显然又影响效率,所以到底用什么方式同时满足效率和可移植性,自己掂量着办吧。

以后使用C++编写程序,如果出现乱码,首先检查C++的编码类型,而且一般情况下都是结束符号没有弄对,SBCSMBCS都是以单字节0结尾,UNICODE是以双字节00结尾的。

 

posted on 2008-11-07 23:27 肥仔 阅读(960) 评论(0)  编辑 收藏 引用 所属分类: 字符编码


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理