C++里边int char 各占 4、1字节 跟多字节 unicode 存储有什么关系
C++里面int char 各占 4、1字节 跟多字节 unicode 存储有什么关系?
RT ,我有一个地方不明白的就是, 我们VS平台中 一般有两种字符集 多字节 和 unicode 默认的是unicode。
如果我选择unicode 那么存储一个字符 就是 两个字节了么? 那char类型呢? 岂不是变成两个字节了? 这理解显然是错的。但是不知道两者有什么联系,
还有int 是4个字节 存储的 ,设置字符集 跟他没关系吧。。
现在有个问题就是 如果我下位机 接受字符 是8位 一次 也就是一个字节一个字节。 如果我是用整型 数组给他发送数据(小于255的数据) ,那岂不是会出错? 因为前面几个字节可能都是0, 所以只能采用 char数组 正好一个字节 ,是这样的吗?我觉得用整型数组发送 就算前面几个是0,也不会影响啊 ,当做是空指令 不就行了。。。
这些概念 比较混乱 ,求大侠支支招。
------解决方案--------------------
sizeof(char)始终是1,与你是Unicode编码还是多字节编码无关。
------解决方案--------------------
请查看TCHAR 和 CHAR的定义。
TCHAR是跟着项目的子附近动态变化的,CHAR是不变的
------解决方案--------------------
多字节和UNICODE所说的占字节数,说的是一个字符(并不是特指一个char),在多字节环境下,一个字符是一个字节(等同于char),在UNICODE环境下,一个字符是两个字节(等同于wchar_t)。
只有TCHAR是跟字符集相关,CHAR是固定的,不管你用什么字符集,CHAR都是一个字节。
有兴趣就看tchar.h这个头文件吧,里面有你想要得到的答案,以下是截取的一段:
------解决方案--------------------
如果我选择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中的
------解决方案--------------------
up
------解决方案--------------------
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
RT ,我有一个地方不明白的就是, 我们VS平台中 一般有两种字符集 多字节 和 unicode 默认的是unicode。
如果我选择unicode 那么存储一个字符 就是 两个字节了么? 那char类型呢? 岂不是变成两个字节了? 这理解显然是错的。但是不知道两者有什么联系,
还有int 是4个字节 存储的 ,设置字符集 跟他没关系吧。。
现在有个问题就是 如果我下位机 接受字符 是8位 一次 也就是一个字节一个字节。 如果我是用整型 数组给他发送数据(小于255的数据) ,那岂不是会出错? 因为前面几个字节可能都是0, 所以只能采用 char数组 正好一个字节 ,是这样的吗?我觉得用整型数组发送 就算前面几个是0,也不会影响啊 ,当做是空指令 不就行了。。。
这些概念 比较混乱 ,求大侠支支招。
------解决方案--------------------
sizeof(char)始终是1,与你是Unicode编码还是多字节编码无关。
------解决方案--------------------
请查看TCHAR 和 CHAR的定义。
TCHAR是跟着项目的子附近动态变化的,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中的
------解决方案--------------------
up
------解决方案--------------------
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