WEB开发网
开发学院软件开发VC 宽字符标量L"xx"在VC6.0/7.0和GNU g++中的不同实现... 阅读

宽字符标量L"xx"在VC6.0/7.0和GNU g++中的不同实现

 2007-03-15 21:55:05 来源:WEB开发网   
核心提示: 关于上述结论可以有下面这个程序来验证://author: smileonce#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <windows.h>void pr

关于上述结论可以有下面这个程序来验证://author: smileonce
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
void prt( const void* padd, size_t n )
{
  const unsigned char* p = static_cast<const unsigned char*>( padd );
  const unsigned char* pe = p + n;
  for( ; p<pe; ++p ) printf( " %02X", *p ); printf( "
" );
}
int main()
{
  char a[] = "VC知识库";
  wchar_t b[] = L"VC知识库";
  prt( a, sizeof(a) );
  prt( b, sizeof(b) );
  PSTR pMultiByteStr = (PSTR)a;
  PWSTR pWideCharStr;
  int nLenOfWideCharStr;
  // 利用API函数MultiByteToWideChar()来把a转化成unicode字符
  nLenOfWideCharStr = MultiByteToWideChar( CP_ACP, 0, pMultiByteStr, -1, NULL, 0);
  pWideCharStr = (PWSTR)HeapAlloc( GetProcessHeap(), 0, nLenOfWideCharStr * sizeof(WCHAR) );
  assert( pWideCharStr );
  MultiByteToWideChar( CP_ACP, 0, pMultiByteStr, -1, pWideCharStr, nLenOfWideCharStr );
  prt( pWideCharStr, nLenOfWideCharStr * sizeof(WCHAR) );
  system( "Pause" );
//  // 说明:
//    56 43 D6 AA CA B6 BF E2 00       //char a[] = "VC知识库";
//    56 00 43 00 E5 77 C6 8B 93 5E 00 00  //wchar_t b[] = L"VC知识库";
//    56 00 43 00 E5 77 C6 8B 93 5E 00 00  //用MultiByteToWideChar()把a转换为unicode
//  // 可见,b[]的字符代码就是unicode代码
  return 0; 
}   
呵呵,问题已经明了,总结一下:

  • ISO C 中 wchar_t 是一个 typedef,ISO C++ 中 wchar_t 是语言内建的数据类型,L"xx" 是ISO C/C++ 语言内建的表示 wchar_t 的文本量的语法;
  • wchar_t 的长度是由实现决定的;
  • L"xx" 的意义是由实现决定的;
  • 默认的 "xx" 是 non-wide-char,其每个元素数据的类型是 char;与其相对应的 L"xx" 是wide-char,其每个元素数据的类型是wchar_t。
  • 为什么 C/C++ 语言把 L"xx" 定义为由实现决定的呢?这显然是为了 C/C++ 的普适性、可移植性。Bjarne 的观点认为,C++ 的方式是允许程序员使用任何字符集作为串的字符类型。另外,unicode 编码已经发展了若干版本了,是否能永久适合下去也不得而知。有关 unicode 的详细论述以及和其它字符集的比较,我推荐你看《无废话xml》。

    上一页  1 2 

    Tags:字符 标量 quot

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接