1. 程式人生 > >c++轉碼基礎(1):各種編碼型別及unicode和uft-8互轉

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多個簡體漢字了。

  在這些編碼裡,我們還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在

ASCII 裡本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,

  這就是常說的”全形”字元,而原來在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):各種編碼型別unicodeuft-8

什麼是Ascii編碼? 單位元組編碼,適用於所有拉丁文字字母. ASCII 碼使用指定的7 位或8 位二進位制數組合來表示128 或256 種可能的字元. 標準ASCII 碼也叫基礎ASCII碼,使用7 位二進位制數(剩下的1位二進位制為0)來表示所有的大寫和小寫字母,數字

c++中gbkutf-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、UnicodeUTF-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,UnicodeUTF-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,UnicodeUTF-8的區別理解

1. ASCII碼         我們知道,在計算機內部,所有的資訊最終都表示為一個二進位制的字串。每一個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為一個位元組(byte)。也就是說,一個位元組一共可以用來表示256種不同的狀

字元編碼ASCII,UnicodeUTF-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從文件中查詢元素,並對其進行操作。