C++里面int char 各占 4、1字节 跟多字节 unicode 存储有什么关系? sizeof(char)始终是1,与你是Unicode编码还是多字节编码无关。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请查看TCHAR 和 CHAR的定义。TCHAR是跟着项目的子附近动态变化的,CHAR是不变的 那多字节符集 和 unicode 中所说的 占字节数 指的是什么? 比如多字节字符集说 字符一个字节 汉子两个字节 unicode 说 字符是两个字节 在unicode 下定义 char类型 也是一个字节呀, 怎么不是两个字节? 它到底影响的是什么?能说清楚么? 那多字节符集 和 unicode 中所说的 占字节数 指的是什么? 比如多字节字符集说 字符一个字节 汉子两个字节 unicode 说 字符是两个字节 在unicode 下定义 char类型 也是一个字节呀, 怎么不是两个字节? 它到底影响的是什么?能说清楚么? 多字节和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;... 如果我选择unicode 那么存储一个字符 就是 两个字节了么? 那char类型呢? 岂不是变成两个字节了? 这理解显然是错的。但是不知道两者有什么联系,这个理解是对的,Unicode每个字符都是两个字节,汉字本来就是两个字节,英文字符被控制为2字节,高位填充0 还有int 是4个字节 存储的 ,设置字符集 跟他没关系吧。。字符集和数值类型数据没有关系,只和字符数据相关现在有个问题就是 如果我下位机 接受字符 是8位 一次 也就是一个字节一个字节。 如果我是用整型 数组给他发送数据(小于255的数据) ,那岂不是会出错? 因为前面几个字节可能都是0, 所以只能采用 char数组 正好一个字节 ,是这样的吗?我觉得用整型数组发送 就算前面几个是0,也不会影响啊 ,当做是空指令 不就行了和下位机通信,则看你的协议,如果传送普通字符,在Unicode下,将上位机数据转换为unsigned char数组发送 字符集是指名 "程序中涉及到的字符串的编码类型" 跟基本数据类型占几个字节, 无任何关系 因为基本的字母和常用字符不用说, 其ASCII码不管在哪个字符集中, 都是一样的.然而世界各国语言那么多, 0-255就表达一个汉字就不够用了. 所以就要想办法来表达汉字就需要编码.在多字集下一般使用的是GB2312编码, 而UNICODE是国际标准, 所以对于同人下汉字" 阿" 肯定就会有不同编码,即内存中的数值表示就完全不同.对于数据通信, 底层最好都是以字节为单位操作. char是一个类型,sizeof一定是1,你说的存储一个字符他占2个字节不是存储在char中,是在wchar_t中的 按照你这么说的话 ,如果我把工程设置成 字符集unicode 那么我sizeof一个字符的话 应该是 两个字节咯?那为什么不是这样的呢? 这位大侠 意思是 说 字符集 是对 字符串 而言的吗? 也就是“1234” “abc” “论坛” 这样的 字符串的存储而言的么? char 还是一个字节,TCHAR变成了WCHAR,其他的相关宏函数都从XXXXW了,其他数据类型没有变,主要是对宽字符的转换,还可以使用atoi 等函数 不是.在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类型, 即不管它是字符还是什么东西, 只关心二进制. 利用套接字的网络聊天室的问题? 一个字-符-串的问题 怎么在对话框上创建按钮 如何制定一个COM接口,让别人写com MFC中TAB控件如何使用?可以像.NET中一样直接设置页标签内容吗? 500分求较好的H263和MPEG4算法源码!!各位大哥请帮忙 中文短信问题 请教:密码框如何屏蔽掉“Ctrl+V”?立即结帐,谢谢! 谁能给个非mfc的动态库源码,越简单越好! 为什么VC做出的EXE文件 别人无法打开 MFC对话框上添加树形控件问题 【求助】DeviceIoControl FSCTL_LOCK_VOLUME拒绝访问
TCHAR是跟着项目的子附近动态变化的,CHAR是不变的
那多字节符集 和 unicode 中所说的 占字节数 指的是什么? 比如多字节字符集说 字符一个字节 汉子两个字节 unicode 说 字符是两个字节 在unicode 下定义 char类型 也是一个字节呀, 怎么不是两个字节? 它到底影响的是什么?能说清楚么?
那多字节符集 和 unicode 中所说的 占字节数 指的是什么? 比如多字节字符集说 字符一个字节 汉子两个字节 unicode 说 字符是两个字节 在unicode 下定义 char类型 也是一个字节呀, 怎么不是两个字节? 它到底影响的是什么?能说清楚么?
#include <wchar.h>
...
typedef wchar_t TCHAR;
...
#else /* ndef _UNICODE *//* ++++++++++++++++++++ SBCS and MBCS ++++++++++++++++++++ */#include <string.h>
...
typedef char TCHAR;
...
在多字集下一般使用的是GB2312编码, 而UNICODE是国际标准, 所以对于同人下汉字" 阿" 肯定就会有不同编码,即内存中的数值表示就完全不同.对于数据通信, 底层最好都是以字节为单位操作.
按照你这么说的话 ,如果我把工程设置成 字符集unicode 那么我sizeof一个字符的话 应该是 两个字节咯?那为什么不是这样的呢?
这位大侠 意思是 说 字符集 是对 字符串 而言的吗? 也就是“1234” “abc” “论坛” 这样的 字符串的存储而言的么?
在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类型, 即不管它是字符还是什么东西, 只关心二进制.