sizeof(char)始终是1,与你是Unicode编码还是多字节编码无关。

解决方案 »

  1.   

    请查看TCHAR 和 CHAR的定义。
    TCHAR是跟着项目的子附近动态变化的,CHAR是不变的
      

  2.   


    那多字节符集 和 unicode 中所说的 占字节数 指的是什么? 比如多字节字符集说 字符一个字节 汉子两个字节  unicode 说 字符是两个字节  在unicode 下定义 char类型 也是一个字节呀,  怎么不是两个字节? 它到底影响的是什么?能说清楚么?
      

  3.   


    那多字节符集 和 unicode 中所说的 占字节数 指的是什么? 比如多字节字符集说 字符一个字节 汉子两个字节  unicode 说 字符是两个字节  在unicode 下定义 char类型 也是一个字节呀,  怎么不是两个字节? 它到底影响的是什么?能说清楚么?
      

  4.   

    多字节和UNICODE所说的占字节数,说的是一个字符(并不是特指一个char),在多字节环境下,一个字符是一个字节(等同于char),在UNICODE环境下,一个字符是两个字节(等同于wchar_t)。只有TCHAR是跟字符集相关,CHAR是固定的,不管你用什么字符集,CHAR都是一个字节。有兴趣就看tchar.h这个头文件吧,里面有你想要得到的答案,以下是截取的一段:#ifdef  _UNICODE/* ++++++++++++++++++++ UNICODE ++++++++++++++++++++ */
    #include <wchar.h>
    ...
    typedef wchar_t     TCHAR;
    ...
    #else   /* ndef _UNICODE *//* ++++++++++++++++++++ SBCS and MBCS ++++++++++++++++++++ */#include <string.h>
    ...
    typedef char            TCHAR;
    ...
      

  5.   

    如果我选择unicode 那么存储一个字符 就是 两个字节了么?  那char类型呢? 岂不是变成两个字节了? 这理解显然是错的。但是不知道两者有什么联系,这个理解是对的,Unicode每个字符都是两个字节,汉字本来就是两个字节,英文字符被控制为2字节,高位填充0          还有int 是4个字节 存储的 ,设置字符集  跟他没关系吧。。字符集和数值类型数据没有关系,只和字符数据相关现在有个问题就是  如果我下位机 接受字符 是8位 一次 也就是一个字节一个字节。  如果我是用整型 数组给他发送数据(小于255的数据) ,那岂不是会出错? 因为前面几个字节可能都是0, 所以只能采用 char数组 正好一个字节 ,是这样的吗?我觉得用整型数组发送 就算前面几个是0,也不会影响啊 ,当做是空指令 不就行了和下位机通信,则看你的协议,如果传送普通字符,在Unicode下,将上位机数据转换为unsigned char数组发送
      

  6.   

    字符集是指名  "程序中涉及到的字符串的编码类型"   跟基本数据类型占几个字节, 无任何关系 因为基本的字母和常用字符不用说,  其ASCII码不管在哪个字符集中, 都是一样的.然而世界各国语言那么多, 0-255就表达一个汉字就不够用了. 所以就要想办法来表达汉字就需要编码.
    在多字集下一般使用的是GB2312编码, 而UNICODE是国际标准, 所以对于同人下汉字" 阿" 肯定就会有不同编码,即内存中的数值表示就完全不同.对于数据通信, 底层最好都是以字节为单位操作. 
      

  7.   

    char是一个类型,sizeof一定是1,你说的存储一个字符他占2个字节不是存储在char中,是在wchar_t中的
      

  8.   


    按照你这么说的话 ,如果我把工程设置成 字符集unicode 那么我sizeof一个字符的话 应该是 两个字节咯?那为什么不是这样的呢?
      

  9.   


    这位大侠 意思是 说 字符集 是对 字符串 而言的吗? 也就是“1234”  “abc”  “论坛” 这样的 字符串的存储而言的么?
     
      

  10.   

    char  还是一个字节,TCHAR变成了WCHAR,其他的相关宏函数都从XXXXW了,其他数据类型没有变,主要是对宽字符的转换,还可以使用atoi 等函数
      

  11.   

    不是.
    在ASCII或者UNICODE下,  "1234"这样的写法在VS中都会认为是  const char *  
    只有加了  L"1234"  这样在两种环境下, 都是 const wchar_t *一般这个"多字符集"和"UNICODE"环境的设置影响的是程序中什么的一些与字符串相关的类或者函数.
    比如MFC的CString,   它实际是CStringT,  在多字符集下, 它实际是CStringA.   在UNICODE下, 它实际是CStringW.
    还有很多函数需要传入字符串的.  很多都是  LPCTSTR  ,  在多字符集下实际是  const char *  在UNICODE下实际是const wchar_t *
    或者函数本身就有两个版本
    FILE *fopen( 
       const char *filename,
       const char *mode 
    );
    FILE *_wfopen( 
       const wchar_t *filename,
       const wchar_t *mode 
    );因为VS已经对这些函数做了  XXXXT版本的宏定义, 而调用哪个函数, 一般就决定了UNIOCDE宏.
    比如CreateFile函数.
    #ifdef UNICODE                                            //如果定义了UNICODE
    #define CreateFile  CreateFileW               //使用CreateFileW 替换CreateFile
    #else
    #define CreateFile  CreateFileA                //否则使用CreateFileA替换CreateFile
    #endif // !UNICODE所以还是那句话,  只要是关于通信的, 最好使用BYTE类型, 即不管它是字符还是什么东西, 只关心二进制.