ASCII码
ASCII码就是一个字符集,0-127之间,最高位0
每一个字符都对应一个数字
'A' == 65
'0' == 48
字符集都由一些组织制定发布,例如ISO/IEC,ASCII码的字符集编号为ISO/IEC 646
拉丁字符集Latin
包括希腊字母,Latin-1是西欧字符,Latin-2是东欧字符
拉丁字符的总数超过了256个,无法用char型表示,得用两个字节
char a = 'α';//错误!问题原因:无法只用一个字节表示一个字符
拉丁字符最高位为1
中文字符集
GB2312 中文简体国标码
GBK 扩展中文GB编码(兼容GB2312)
GB18030 用1-4个字节编码,容量超大
BIG5 中文繁体编码
CJK 中日韩大字符集编码
Unicode 统一码,用0 - 0x10FFFF来映射全球各国的文字
GB2312/GBK
GB2312不包括一些生僻字,GBK>GB2312
中文windows默认GBK编码
一个中文字符占有两个字节
Unicode
-
UTF-32
每个字符用一个int存,简单,但太浪费空间
abcd->16个字节
-
UTF-16
每个字符用1~2个short来表示。我->2个字节,a->2个字节
-
UTF-8
每个字符用1~4个字节来表示,节省空间。我->3个字节,a->1个字节
Linux字体默认UTF-8
字符编码的转换
若你的字符串是GBK编码,而别人要求UTF16,强制发过去只能得到乱码了。
VC下的转换方法
用wchar_t代表宽字符,相当于short类型,一个wchar_t的数组来存放Unicode字符
#include <stdio.h>
#include <stdlib.h>
// 头文件
#include <winsock2.h>
#include <windows.h>
// GBK -> UTF-16
int test1()
{
//char text_gbk[] = { 0xC9, 0xDB, 0xB7, 0xA2, 0};
char text_gbk[] = "邵发"; // 字符串字面常量,取决于cpp文件本身的字符集
wchar_t text_utf16[256] = {0};
int n = MultiByteToWideChar(
CP_ACP, //当前cpp的编码,也就是GBK
0,
text_gbk,
strlen(text_gbk),
text_utf16,
256);
printf("结果: %d 个宽字符 \n", n);
int n = sizeof(text_gbk);
return 0;
}
// GBK -> UTF-16 -> UTF-8
int test2()
{
char text_gbk[] = "邵发"; // 字符串字面常量,取决于cpp文件本身的字符集
//
wchar_t text_utf16[256] = {0};
int n1 = MultiByteToWideChar(
CP_ACP,
0,
text_gbk,
strlen(text_gbk),
text_utf16,
256);
printf("结果: %d 个宽字符 \n", n1);
//
char text_utf8[256];
int n2 = WideCharToMultiByte(
CP_UTF8,
0,
text_utf16,
n1,
text_utf8,
256,
NULL,
0);
printf("结果: %d 个字节 \n", n2);
return 0;
}
int main()
{
//test1();
test2();
return 0;
}