ASCII碼
ASCII碼就是一個(gè)字符集,0-127之間,最高位0
每一個(gè)字符都對(duì)應(yīng)一個(gè)數(shù)字
'A' == 65
'0' == 48
字符集都由一些組織制定發(fā)布,例如ISO/IEC,ASCII碼的字符集編號(hào)為ISO/IEC 646
拉丁字符集Latin
包括希臘字母,Latin-1是西歐字符,Latin-2是東歐字符
拉丁字符的總數(shù)超過(guò)了256個(gè),無(wú)法用char型表示,得用兩個(gè)字節(jié)
char a = 'α';//錯(cuò)誤!問(wèn)題原因:無(wú)法只用一個(gè)字節(jié)表示一個(gè)字符
拉丁字符最高位為1
中文字符集
GB2312 中文簡(jiǎn)體國(guó)標(biāo)碼
GBK 擴(kuò)展中文GB編碼(兼容GB2312)
GB18030 用1-4個(gè)字節(jié)編碼,容量超大
BIG5 中文繁體編碼
CJK 中日韓大字符集編碼
Unicode 統(tǒng)一碼,用0 - 0x10FFFF來(lái)映射全球各國(guó)的文字
GB2312/GBK
GB2312不包括一些生僻字,GBK>GB2312
中文windows默認(rèn)GBK編碼
一個(gè)中文字符占有兩個(gè)字節(jié)
Unicode
-
UTF-32
每個(gè)字符用一個(gè)int存,簡(jiǎn)單,但太浪費(fèi)空間
abcd->16個(gè)字節(jié)
-
UTF-16
每個(gè)字符用1~2個(gè)short來(lái)表示。我->2個(gè)字節(jié),a->2個(gè)字節(jié)
-
UTF-8
每個(gè)字符用1~4個(gè)字節(jié)來(lái)表示,節(jié)省空間。我->3個(gè)字節(jié),a->1個(gè)字節(jié)
Linux字體默認(rèn)UTF-8
字符編碼的轉(zhuǎn)換
若你的字符串是GBK編碼,而別人要求UTF16,強(qiáng)制發(fā)過(guò)去只能得到亂碼了。
VC下的轉(zhuǎn)換方法
用wchar_t代表寬字符,相當(dāng)于short類(lèi)型,一個(gè)wchar_t的數(shù)組來(lái)存放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[] = "邵發(fā)"; // 字符串字面常量,取決于cpp文件本身的字符集
wchar_t text_utf16[256] = {0};
int n = MultiByteToWideChar(
CP_ACP, //當(dāng)前cpp的編碼,也就是GBK
0,
text_gbk,
strlen(text_gbk),
text_utf16,
256);
printf("結(jié)果: %d 個(gè)寬字符 \n", n);
int n = sizeof(text_gbk);
return 0;
}
// GBK -> UTF-16 -> UTF-8
int test2()
{
char text_gbk[] = "邵發(fā)"; // 字符串字面常量,取決于cpp文件本身的字符集
//
wchar_t text_utf16[256] = {0};
int n1 = MultiByteToWideChar(
CP_ACP,
0,
text_gbk,
strlen(text_gbk),
text_utf16,
256);
printf("結(jié)果: %d 個(gè)寬字符 \n", n1);
//
char text_utf8[256];
int n2 = WideCharToMultiByte(
CP_UTF8,
0,
text_utf16,
n1,
text_utf8,
256,
NULL,
0);
printf("結(jié)果: %d 個(gè)字節(jié) \n", n2);
return 0;
}
int main()
{
//test1();
test2();
return 0;
}