c++轉碼基礎(1):各種編碼型別及unicode和uft-8互轉
什麼是Ascii編碼?
單位元組編碼,適用於所有拉丁文字字母.
ASCII 碼使用指定的7 位或8 位二進位制數組合來表示128 或256 種可能的字元.
標準ASCII 碼也叫基礎ASCII碼,使用7 位二進位制數(剩下的1位二進位制為0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字元。其中:
0~31及127(共33個)是控制字元或通訊專用字元(其餘為可顯示字元),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS(退格)、BEL(響鈴)等;
通訊專用字元:SOH(文頭)、EOT(文尾)、ACK(確認)等;ASCII值為8、9、10 和13 分別轉換為退格、製表、換行和回車字元。
它們並沒有特定的圖形顯示,但會依不同的應用程式,而對文字顯示有不同的影響
32~126(共95個)是字元(32是空格),其中48~57為0到9十個阿拉伯數字。65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其餘為一些標點符號、運算子號等。
擴充套件ASCII 字元是從128 到255(0x80-0xff)的字元.擴充套件ASCII不再是國際標準
什麼是DBCS字符集?unicode的由來
中文常用的字符集有GB2312-80,GBK(大陸的中文字符集),Big5(臺灣的倚天漢字系統),unicode.
為了解決中國、日本和韓國的象形文字元和ASCII的某種相容性,開發出雙位元組字符集(DBCS:double-byte character set)。
DBCS從256程式碼開始,就像ASCII一樣。較高的128個程式碼中的某些總是跟隨著第二個位元組。這兩個位元組一起(稱作首位元組和跟隨位元組)定義一個字元,通常是一個複雜的象形文字。
為了解決中文字元的應用,中國定義了一套GB2312的字符集:
字符集規定:127號之後的奇異符號們直接取消掉, 規定:一個小於127的字元的意義與原來相同,但兩個大於127的字元連在一起時,就表示一個漢字,
前面的一個位元組(他稱之為高位元組)從0xA1用到 0xF7,後面一個位元組(低位元組)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。
在這些編碼裡,我們還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在
這就是常說的”全形”字元,而原來在127號以下的那些就叫”半形”字元了。 中國人民看到這樣很不錯,於是就把這種漢字方案叫做 “GB2312“。GB2312 是對 ASCII 的中文擴充套件。
但是中國的漢字太多了,我們很快就就發現有許多人的人名沒有辦法在這裡打出來,特別是某些很會麻煩別人的國家領導人。於是我們不得不繼續把 GB2312 沒有用到的碼位找出來老實不客氣地用上。
後來還是不夠用,於是乾脆不再要求低位元組一定是127號之後的內碼,只要第一個位元組是大於127就固定表示這是一個漢字的開始,不管後面跟的是不是擴充套件字 符集裡的內容。
結果擴充套件之後的編碼方案被稱為 GBK 標準,GBK包括了GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。 後來少數民族也要用電腦了,於是我們再擴充套件,又加了幾千個新的少數民族的字,GBK擴成了 GB18030。
從此之後,中華民族的文化就可以在計算機時代中傳承了。 中國的程式設計師們看到這一系列漢字編碼的標準是好的,於是通稱他們叫做 “DBCS“(Double Byte Charecter Set 雙位元組字符集)
後來因為很多地區都定義自己的編碼字元集合,而且都是重疊的,所以在跨區域通訊向出現了問題. ISO (國際標誰化組織)為了解決這個問題,廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號 的編碼!他們打算叫它”Universal Multiple-Octet Coded Character Set”,簡稱 UCS, 俗稱 “unicode“。
unicode編碼的形式?UTF-8的由來?
unicode開始制訂時,計算機的儲存器容量極大地發展了,空間再也不成為問題了。於是 ISO 就直接規定必須用兩個位元組,也就是16位來統一表示所有的字元,
對於ASCII裡的那些“半形”字元,unicode包持其原編碼不變,只是將其長度由原 來的8位擴充套件為16位,而其他文化和語言的字元則全部重新統一編碼。
由於”半形”英文符號只需要用到低8位,所以其高8位永遠是0,因此這種大氣的方案在 儲存英文文字時會多浪費一倍的空間。
如以下字元編碼的unicode 編碼(UCS-2):
字元 十六進位制編碼 二進位制編碼
I 0049 00000000 01001001
t 0074 00000000 01110100
' 0027 00000000 00100111
s 0073 00000000 01110011
0020 00000000 00100000
知 77e5 01110111 11100101
乎 4e4e 01001110 01001110
日 65e5 01100101 11100101
報 62a5 01100010 10100101
unicode很長一段時間無法推廣的原因有兩個:
1. unicode 是雙字元編碼,在網路傳輸和不同機器上存在大小端的問題;相同的字符集在不同的位置存在幾碼順序不同。
2. unicode 1~127的文字元浪費一個位元組的空間
為了解決unicode在網路上傳輸的問題,出現了面向傳輸的UTF(UCS Transfer Format)標準,UTF-8就是每次8位傳輸資料,UTF-16就是每次16位資料(先有的UTF-16,但是和unicode一樣的問題)。
UTF-8就是在網際網路上使用最廣的一種unicode的實現方式,這是為傳輸而設計的編碼,並使編碼無國界。
UTF-8編碼格式?
UTF-8最大的一個特點,就是它是一種變長的編碼方式.
它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度,當字元在ASCII 碼的範圍時,就用一個位元組表示,保留了ASCII字元一個位元組的編碼做為它的一部分,
注意的是unicode一箇中文字元佔2個位元組,而UTF-8一箇中 文字元佔3個位元組)。從unicode到uft-8並不是直接的對應,而是要過一些演算法和規則來轉換。
UTF-8是這樣做的:
1. 單位元組的字元,位元組的第一位設為0,對於英語文字,UTF-8碼只佔用一個位元組,和ASCII碼完全相同;
2. n個位元組的字元(n>1),第一個位元組的前n位設為1,第n+1位設為0,後面位元組的前兩位都設為10,這n個位元組的其餘空位填充該字元unicode碼,高位用0補足。
這樣就形成了如下的UTF-8標記位:
(十六進位制) | (二進位制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
如以下字元編碼UTF-8:
字元 十六進位制編碼 二進位制編碼
I 49 01001001
t 74 01110100
' 27 00100111
s 73 01110011
20 00100000
知 E79FA5 11100111 10011111 10100101
乎 E4B98E 11100100 10111001 10001110
日 E697A5 11100110 10010111 10100101
報 E68AA5 11100110 10001010 10100101
UTF-8和UTF-16的區別?
區分UTF-8還是UTF-16的檔案:檔案頭包含
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
UTF-16不需要用啥字元來做標誌,所以兩位元組也就是2的16次能表示65536個字元.
表示一個"漢"中文字(27721(十進位制)), UTF-16 是 01101100 01001001; 十六進位制是 6C49
而UTF-8由於裡面有額外的標誌資訊,所有一個位元組只能表示2的7次方128個字元,兩個位元組只能表示2的11次方2048個字元.而三個位元組能表示2的16次方,65536個字元.
所以UTF-8對"漢"的編碼是 11100110 10110001 10001001(這裡不關注大小端的問題,大小端不同,編碼順序不同)
由上面我們可以看出UTF-8需要判斷每個位元組中的開頭標誌資訊,所以如果一當某個位元組在傳送過程中出錯了,就會導致後面的位元組也會解析出錯.而UTF-16不會判斷開頭標誌,即使錯也只會錯一個字元,所以容錯能力強.
大小端問題:
計算機是以位元組為定址單位的,這就涉及到字(2個位元組), 雙字(4個位元組)及其他多位元組單位 在計算機內如何排布的問題, 這裡無非就是2種:低位元組在低地址的little-endian和高位元組在低地址的big-endian.
如何區分當前系統是哪種型別的大小端? 曾經看到有經驗的程式設計師也以當前的作業系統型別來判斷, 實際上系統的大小端和你的CPU架構體系相關聯, 比如說X86是小端, PowPC是大端,ARM則是可控制(預設也是小端)。
要判斷當前環境是大小端實際上很簡單: bool IsLittleEndian() { int i=1; return (*(char *)&i == 1); }
感覺現在大端的應用主要是網路位元組序, Java內部全都是大端。
UCS2和UCS4因為都是用多位元組表示一個字元,所以實際上都有大小端的問題,比如分別對應UCS2-LE和UCS2-BE,Windows上的UNICODE實際上是UCS2-LE;
UTF8因為是位元組流,所以沒有大小端的問題。
base64 編碼:
Base64是網路上最常見的用於傳輸8Bit位元組程式碼的編碼方式之一,大家可以檢視RFC2045~RFC2049,上面有MIME的詳細規範。Base64編碼可用於在HTTP環境下傳遞較長的標識資訊。
因為,Base64將三個位元組轉化成四個位元組,因此Base64編碼後的文字,會比原文字大出三分之一左右。
舉一個具體的例項,演示英語單詞Man如何轉成Base64編碼。
Text content |
M |
a |
n |
|||||||||||||||||||||
ASCII |
77 |
97 |
110 |
|||||||||||||||||||||
Bit pattern |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Index |
19 |
22 |
5 |
46 |
||||||||||||||||||||
Base64-Encoded |
T |
W |
F |
u |
第一步,"M"、"a"、"n"的ASCII值分別是77、97、110,對應的二進位制值是01001101、01100001、01101110,將它們連成一個24位的二進位制字串010011010110000101101110。
第二步,將這個24位的二進位制字串分成4組,每組6個二進位制位:010011、010110、000101、101110。
第三步,在每組前面加兩個00,擴充套件成32個二進位制位,即四個位元組:00010011、00010110、00000101、00101110。它們的十進位制值分別是19、22、5、46。
第四步,根據上表,得到每個值對應Base64編碼,即T、W、F、u。
如果位元組數不足三,則這樣處理:
a)二個位元組的情況:將這二個位元組的一共16個二進位制位,按照上面的規則,轉成三組,最後一組除了前面加兩個0以外,後面也要加兩個0。這樣得到一個三位的Base64編碼,再在末尾補上一個"="號。
比如,"Ma"這個字串是兩個位元組,可以轉化成三組00010011、00010110、00010000以後,對應Base64值分別為T、W、E,再補上一個"="號,因此"Ma"的Base64編碼就是TWE=。
b)一個位元組的情況:將這一個位元組的8個二進位制位,按照上面的規則轉成二組,最後一組除了前面加二個0以外,後面再加4個0。這樣得到一個二位的Base64編碼,再在末尾補上兩個"="號。
比如,"M"這個字母是一個位元組,可以轉化為二組00010011、00010000,對應的Base64值分別為T、Q,再補上二個"="號,因此"M"的Base64編碼就是TQ==。
例項函式:
static const uint8_t *kBase64EncodeTable = (const uint8_t *)
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void base64_encode(const uint8_t *in, uint32_t len, uint8_t *buf) {
buf[0] = kBase64EncodeTable[(in[0] >> 2) & 0x3F];
if (len == 3) {
buf[1] = kBase64EncodeTable[((in[0] << 4) + (in[1] >> 4)) & 0x3f];
buf[2] = kBase64EncodeTable[((in[1] << 2) + (in[2] >> 6)) & 0x3f];
buf[3] = kBase64EncodeTable[in[2] & 0x3f];
} else if (len == 2) {
buf[1] = kBase64EncodeTable[((in[0] << 4) + (in[1] >> 4)) & 0x3f];
buf[2] = kBase64EncodeTable[(in[1] << 2) & 0x3f];
} else { // len == 1
buf[1] = kBase64EncodeTable[(in[0] << 4) & 0x3f];
}
}
static const uint8_t kBase64DecodeTable[256] ={
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
};
void base64_decode(uint8_t *buf, uint32_t len) {
buf[0] = (kBase64DecodeTable[buf[0]] << 2) |
(kBase64DecodeTable[buf[1]] >> 4);
if (len > 2) {
buf[1] = ((kBase64DecodeTable[buf[1]] << 4) & 0xf0) |
(kBase64DecodeTable[buf[2]] >> 2);
if (len > 3) {
buf[2] = ((kBase64DecodeTable[buf[2]] << 6) & 0xc0) |
(kBase64DecodeTable[buf[3]]);
}
}
}
多字元與雙字元轉碼函式:
在Windows上不同編碼方式的相互轉換可以通過WideCharToMultiByte和MutiByteToWideChar進行轉碼。
linux下可以用mbstowcs() ,wcstombs() 或者使用iconv庫函式;
需要注意的問題:
size_t mbstowcs(wchar_t *wcstr,const char *mbstr,size_t count);
這個函式的第三個引數count,大小一定要是mbstr長度的2倍,否則出來的中文也會是亂碼。
iconv庫函式的使用
#include <iconv.h>
iconv_t iconv_open(const char *tocode, const char *fromcode);
size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
int iconv_close(iconv_t cd);
iconv函式的使用需要setlocale() 這個函式設定環境:如:setlocale(LC_ALL,"zh_CN.GB18030");
linux下的庫函式使用麻煩而且易出錯,可以使用下列函式
// 檢查字串中是不是有需要轉換的寬字元(utf-8編碼中的寬字元),當然該函式不能識別是不是unicode編碼,只能識別中文等等多位元組字元的特徵
bool CheckIsUTF8(const char *put_in, int size)
{
if (put_in != NULL && size-- > 0) // size減1預先去掉結尾位置,所有size因為是實際長度+1
{
while (*put_in != 0 && size > 0) // 遍歷
{
unsigned char ch = *put_in;
if (ch > 0x7FU) // 檢查是不是utf8編碼,是的話一次取完,(UTF-8沒有大小端的問題)
{
int cwch = 0; // 記錄個數
while (ch & 0x80U)
{
ch <<= 1;
cwch++;
}
if (cwch > 6 || cwch < 1) // 超過了最大識別邊界
{
put_in++;
size--;
continue;
}
unsigned char ch_g = *put_in++;
size--;
bool isTrue = true;
while (--cwch > 0 && *put_in != 0 && size > 0) // 遞減驗證
{
if (0x80U != ch_g & 0x80U) // 表示沒有
{
isTrue = false;
}
ch_g = *put_in++;
size--;
}
if (isTrue)
{
return true; // 表示包含寬字元編碼
}
}
else
{
put_in++;
size--;
}
}
}
int UTF8ToUTF16(const char *pmbs, wchar_t *pwcs, int size) // pmbs需要有邊界以0結尾,size表示字元個數
{
int cnt = 0;
if (pmbs != NULL && pwcs != NULL && size-- > 0) // size減1預先去掉結尾位置,所有size因為是實際長度+1
{
while (*pmbs != 0 && size > 0) // 遍歷
{
unsigned char ch = *pmbs;
//printf("%c %x\n", ch,ch);
if (ch > 0x7FU) // 檢查是不是utf8編碼,是的話一次取完,(UTF-8沒有大小端的問題)
{
int cwch = 0; // 記錄個數
while (ch & 0x80U) // 檢查字元頭是不是寬字元標記
{
ch <<= 1; // 左移一位,檢查有幾個字元
cwch++;
}
if (cwch > size) // 檢查是不是最後幾個字元
{
*pwcs = *pmbs++;
//printf("1\n");
//printf("1: %ls \n", pwcs);
}
else
{
*pwcs = *pmbs++ & (0xFFU >> cwch); // 付給第一個字元的資料值
size--;
while (--cwch > 0) // 遞減,(沒有做嚴格驗證)
{
if (size <= 0)
{
*pwcs = *pmbs; // 重複複製,保證單值正確
}
else
{
*pwcs <<= 6; // 向大端平移6位(因為跟隨字元都是6位有效)
*pwcs |= (*pmbs++ & 0x3FU); // 新增地位字元
size--;
}
}
//printf("2 \n");
//printf("2:%ls \n", pwcs);
}
}
else
{
*pwcs = *pmbs++; // 表示是單位元組編碼,直接賦值給一個寬字元(自動適應大小端)
size--;
}
//printf("3 \n");
pwcs++;
cnt++;
}
*pwcs = 0; // 以0x00
cnt++;
}
return cnt;
}
int UnicodeToUTF8(const wchar_t *pwcs, char *pmbs, int size)
{
int cnt = 0;
// 這裡 size-- 是預先除去尾零所需位置
if (pwcs != NULL && pmbs != NULL && size-- > 0) {
while (*pwcs != 0 && size > 0) {
if (*pwcs < 0x00000080U) {
*pmbs++ = (char)*pwcs;
size -= 1;
cnt += 1;
}
else if (*pwcs < 0x00000800U) {
// 剩餘空間不夠存放該字元
if (size < 2) {
break;
}
*pmbs++ = (0xFFU << 6) | (*pwcs >> 6);
*pmbs++ = 0x80U | (*pwcs & 0x3FU);
size -= 2;
cnt += 2;
}
else if (*pwcs < 0x00010000U) {
// 剩餘空間不夠存放該字元
if (size < 3) {
break;
}
*pmbs++ = (0xFFU << 5) | (*pwcs >> 12);
*pmbs++ = 0x80U | ((*pwcs >> 6) & 0x3FU);
*pmbs++ = 0x80U | (*pwcs & 0x3FU);
size -= 3;
cnt += 3;
}
else if (*pwcs < 0x00200000U) {
// 剩餘空間不夠存放該字元
if (size < 4) {
break;
}
*pmbs++ = (0xFFU << 4) | (*pwcs >> 18);
*pmbs++ = 0x80U | ((*pwcs >> 12) & 0x3FU);
*pmbs++ = 0x80U | ((*pwcs >> 6) & 0x3FU);
*pmbs++ = 0x80U | (*pwcs & 0x3FU);
size -= 4;
cnt += 4;
}
else if (*pwcs < 0x04000000U) {
// 剩餘空間不夠存放該字元
if (size < 5) {
break;
}
*pmbs++ = (0xFFU << 3) | (*pwcs >> 24);
*pmbs++ = 0x80U | ((*pwcs >> 18) & 0x3FU);
*pmbs++ = 0x80U | ((*pwcs >> 12) & 0x3FU);
*pmbs++ = 0x80U | ((*pwcs >> 6) & 0x3FU);
*pmbs++ = 0x80U | (*pwcs & 0x3FU);
size -= 5;
cnt += 5;
}
else if (*pwcs < 0x80000000U) {
// 剩餘空間不夠存放該字元
if (size < 6) {
break;
}
*pmbs++ = (0xFFU << 2) | (*pwcs >> 30);
*pmbs++ = 0x80U | ((*pwcs >> 24) & 0x3FU);
*pmbs++ = 0x80U | ((*pwcs >> 18) & 0x3FU);
*pmbs++ = 0x80U | ((*pwcs >> 12) & 0x3FU);
*pmbs++ = 0x80U | ((*pwcs >> 6) & 0x3FU);
*pmbs++ = 0x80U | (*pwcs & 0x3FU);
size -= 6;
cnt += 6;
}
else {
// 無法識別的 Unicode 字元
break;
}
pwcs++;
}
*pmbs = 0;
cnt++;
}
return cnt;
}
相關推薦
c++轉碼基礎(1):各種編碼型別及unicode和uft-8互轉
什麼是Ascii編碼? 單位元組編碼,適用於所有拉丁文字字母. ASCII 碼使用指定的7 位或8 位二進位制數組合來表示128 或256 種可能的字元. 標準ASCII 碼也叫基礎ASCII碼,使用7 位二進位制數(剩下的1位二進位制為0)來表示所有的大寫和小寫字母,數字
c++中gbk和utf-8互轉
gbk轉utf-8 char* G2U(const char* gb2312) { ASSERT(gb2312!=NULL); int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
Unicode與UTF-8互轉(C語言實現)
1.1 ASCII碼 我們知道, 在計算機內部, 所有的資訊最終都表示為一個二進位制的字串. 每一個二進位制 位(bit)有0和1兩種狀態, 因此八個二進位制位就可以組合出 256種狀態, 這被稱為一個字 節(byte). 也就是說, 一個位元組一共可以用來表示256種不
Java 字符編碼 ASCII、Unicode和UTF-8
之間 family 打印 com 但是 例如 進制數 英語 utf-16 1 ASCII碼 統一規定英語字符與二進制位之間的關系。ASCII碼一共規定了128個字符的編碼。例如,空格“SPACE”是32(二進制00100000),大寫字母A是65(二進制010000
字元編碼ASCII,Unicode 和 UTF-8
一、ASCII 碼 我們知道,計算機內部,所有資訊最終都是一個二進位制值。每一個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為一個位元組(byte)。也就是說,一個位元組一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從0
字元編碼(ASCII,Unicode和UTF-8) 和 大小端
本文包括2部分內容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”。 第1部分 ASCII,Unicode和UTF-8 介紹 1. ASCII碼 我們知道,在計算機內部,所有的資訊最終都表示為一個二進位制的字串。每一個二進位制位(bit)有0和1
VC下unicode與utf-8互轉
使用場合: VC下使用unicode編碼,如果需要使用utf-8,這時就需要轉換(支援中文) //引數:utf8 要轉換的utf8 指標 unicode接收轉換後的buff nBuffSize buff的大小 返回值:轉換後的unicode大小 int Utf82U
字元編碼ASCII,Unicode和UTF-8的區別及理解
1. ASCII碼 我們知道,在計算機內部,所有的資訊最終都表示為一個二進位制的字串。每一個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為一個位元組(byte)。也就是說,一個位元組一共可以用來表示256種不同的狀
字元編碼ASCII,Unicode和UTF-8
字元編碼介紹文字,他們通常指顯示在螢幕上的字元或者其他的記號;但是計算機不能直接處理這些字元和標記;它們只認識位(bit)和位元組(byte)。實際上,從螢幕上的每一塊文字都是以某種字元編碼(character encoding)的方式儲存的。粗略地說就是,字元編碼提供一種對
python基礎1 - 多文件項目和代碼規範
RM first har 中新 HA str 代碼格式 pycha www. 1. 多文件項目演練 開發 項目 就是開發一個 專門解決一個復雜業務功能的軟件 通常每 一個項目 就具有一個 獨立專屬的目錄,用於保存 所有和項目相關的文件 – 一個項目通常會包含
c理解提高(1)資料型別的本質分析
資料型別本質分析 資料型別概念 “型別”是對資料的抽象 型別相同的資料有相同的表示形式、儲存格式以及相關的操作 程式中使用的所有資料都必定屬於某一種資料型別 資料型別的本質思考 思考資料型別和
各種編碼型別總結
英文字母: 位元組數 : 1;編碼:GB2312 位元組數 : 1;編碼:GBK 位元組數 : 1;編碼:GB18030 位元組數 : 1;編碼:ISO-8859-1 位元組數 : 1;編碼:UTF-8 位元組數 : 4;編碼:UTF-16 位元組數 : 2;編碼:UTF
c語言之基礎-1
1.什麼是識別符號?c語言識別符號的規範 所謂識別符號是指常量、 變數、語句標號以及使用者自定義函式的名稱。C語言規定識別符號只能由字母、數字、 下劃線組成,並且只能由字母、下劃線開頭。一些識別符號被賦於特定的含義就叫做保留字(或稱為關鍵字)。 由ANSI標準定義的保留
C++ 實現unicode到utf-8的轉碼
思路: 獲取字串裡面中的Unicode部分,然後將該部分轉換位utf-8格式的字元,最後將字串裡面的所有Unicode替換為utf-8即可。 廢話不多少,直接上程式碼: 標頭檔案: /* * charsetEncode.h * * Created on: Jul
C語言 -- c語言練習題——基礎1
《c語言練習題——基礎1》http://blog.csdn.net/ivan804638781/article/details/52387884《c語言練習題——基礎2》http://blog.csdn.net/ivan804638781/article/details/52
C#基礎 Enum 輸出列舉型別的數值和名稱
慈心積善融學習,技術願為有情學。善心速造多好事,前人栽樹後乘涼。我今於此寫經驗,願見文者得啟發。 .NET Framework : 4.7.2 IDE : Visual Stud
java-基礎-1.3 char型別
1.介紹 1.範圍 無符號,\u0000-\uffff, 0 - 2^16 ,0~65536 2.內部 採用unicode字符集 utf-16編碼 3.面對特殊字元時,unico
C#將結構體和指針互轉的方法
緩沖 style system RR 程序集 ascii 通知 work Coding 1. 功能及位置 將數據從托管對象封送到非托管內存塊,屬於.NET Framework 類庫 命名空間:System.Runtime.InteropServices
從零開始學Python【1】--資料型別及結構
一直想靜下心來、花點時間學習Python3這門火爆的高階語言,但總是事與願違,故只能擠點時間,做到每天進步一點點。從今天開始我把積累的點滴知識與大家做個分享,也歡迎感興趣的朋友指教與提議。 首先從Python的基礎資料型別和資料結構說起,資料型別主要包含三種,分別是數值型、字元型和日
jQuery基礎—1、jQuery概述及環境搭建
1.1JQuery是什麼? jQuery在javascript基礎上開發出來的,對javascript進行了封裝,功能更強大,操作更方便的一種javascript庫。 JQuery=Javascript + Query(查詢)= 通過Javascript從文件中查詢元素,並對其進行操作。