字符:字母、数字、符号、汉字都是字符
1Byte(字节) = 8bit(比特、位)
- c中的char
在c语言中,一个char类型的变量是1字节,1字节 = 8位,能存2^8 = 256个字符(0-255,0也算一个)。分别对应ASCII表里的字符。键盘上的字母、符号刚好存完,所以没办法存中文。
*- .net中的char
在.net中,一个char类型的变量是2字节,在vs中将光标移动到char上会显示“将字符表示为UTF-16代码单位"(采用双字节编码标准对字符进行编码),意思就是一个char是16位,2个字节。2^16=65536(能存
0-65535个字符)。所以不仅能存字符、符号,还能存中文
- 疑惑
那么新的问题来了,按照上面的逻辑,在c语言中,字符数组应该只能存一个个的字符,为什么能存汉字?
在这里补充一下
Unicode 与 UTF-8Unicode 本质上是一种标准,它们描述了一个字符集里都有什么字符。
而 UTF-8、UTF-16 等是对 Unicode 的实现,他们采用了不同的映射关系来编码字符。
以 UTF-8 为例,在 UTF-8 中,一个汉字一般采用两个代码单元(code unit)来编码一个代码点(code point)。代码点(code point)指的是一个字符对应的编码表示,而这个编码表示可能是一个字节,也可能是两个字节,或更多。对于 UTF-8 来说,他使用一个字节来描述一个代码单元,也就是说,一个代码点可以由一个或多个代码单元表示。为什么要这么做?因为 UTF-8 是一种非常巧妙的字符集,他通过其巧妙的编码方式实现了代码点可变长这一特点。对于 ASCII 字符仅使用一个字节储存,而对于某个汉字则可能使用两个字节,节省空间。
上面说了一大堆让人迷迷糊糊,可不是我说的,我复制的。
大致意思是以UTF-8为例,
你如果往字符数组里存单字节的字符(字母\符号),它会记下来,这个字节的空间存的是单字节的东西,翻译的时候翻译为单字节字符。
你如果往字符数组里存汉字,它会记下来,这连着的两个字节的空间存的是双字节的东西,翻译的时候翻译为汉字字符。
翻译:数据存到计算机中全是0、1代码,用的时候翻译成字符