華為云 wordpress微信搜一搜seo
一直以來,字符串的編碼問題對于新手程序員來說,或者平常不太涉獵這方面的程序員來說,是猶如靈異學(xué)一樣的存在。經(jīng)常會遇到莫名其妙的編碼問題,導(dǎo)致的各種的無法理解的錯誤。
? 今天,本問就來介紹一下作者所知曉的一切的字符編碼知識。
0x1.初識ASCII
? 說起字符串編碼,不得不說到現(xiàn)代計算機(jī)的起源,在二十世紀(jì)早期,美國的科學(xué)家和工程師開始研究并開發(fā)原始的計算機(jī)設(shè)備。一些早期的計算機(jī)設(shè)備和概念都是在美國發(fā)展的,為后來的計算機(jī)技術(shù)的發(fā)展奠定了基礎(chǔ)。
? 因此最早的計算機(jī)主要編碼都是為了適應(yīng)英文來設(shè)計的,英文由字母、數(shù)字、標(biāo)點符號等組成??傆?6個英文字母(不區(qū)分大小寫)、10個數(shù)字(0-9)、大約32個常見標(biāo)點符號(包括空格)
0x2.隨著更多國家加入互聯(lián)網(wǎng),兼容語言日益重要
隨著國際化的發(fā)展和不同國家語言的日益重要,需要一種能夠表示更多字符的編碼方式。因此,針對不同的需求,出現(xiàn)了一些擴(kuò)展字符集和編碼標(biāo)準(zhǔn),其中兩個最常見的是GBK和UTF-8。
-
GBK 是漢字內(nèi)碼擴(kuò)展規(guī)范的簡稱,是在ASCII基礎(chǔ)上的漢字編碼擴(kuò)展。它對中文進(jìn)行了編碼,并能夠表示超過 20000 個中文字符。它兼容ASCII編碼,并使用1個或2個字節(jié)來表示一個字符,使得它能夠包含更多的字符。
- 基本原理:
- GBK編碼使用單字節(jié)編碼和雙字節(jié)編碼混合的方式來表示字符。
- 對于ASCII字符,使用單字節(jié)表示,編碼和ASCII兼容。
- 對于非ASCII字符(包括漢字等),使用雙字節(jié)表示。
- 編碼范圍:
- 單字節(jié)編碼范圍:0x00-0x7F,與ASCII相同。
- 雙字節(jié)編碼范圍:0x81-0xFE,兩個字節(jié)的第一個字節(jié)在0x81-0xFE之間,第二個字節(jié)在0x40-0xFE之間(但不包括0x7F)。
- 占位個數(shù):
- 對于單字節(jié)編碼的ASCII字符,占用一個字節(jié)(8位)。
- 對于雙字節(jié)編碼的非ASCII字符,占用兩個字節(jié)(16位)。
- 編碼規(guī)則:
- 對于雙字節(jié)編碼,第一個字節(jié)的范圍確定了該字符的編碼區(qū),第二個字節(jié)的范圍則確定了具體的字符。
- GBK編碼的中文字符通常使用兩個字節(jié)表示,第一個字節(jié)的范圍是0x81-0xFE,第二個字節(jié)的范圍是0x40-0xFE(不包括0x7F)。
- 例如,漢字“中”在GBK編碼中的值是0xD6D0。
- 兼容性:
- GBK編碼是對GB2312編碼的擴(kuò)展,因此GB2312編碼的中文字符在GBK中仍然能夠正確解碼。
- 同時,GBK編碼也與ASCII編碼兼容,保證了在同一個文本文件中可以混合使用ASCII字符和漢字字符。
- 基本原理:
-
UTF-8 是一種針對Unicode的可變長度字符編碼,它被設(shè)計用來在互聯(lián)網(wǎng)上處理多種語言的文本。UTF-8 使用1至4個字節(jié)為每個字符編碼,能夠表示地球上幾乎所有的文字。它是一種廣泛使用的編碼標(biāo)準(zhǔn),可以表示包括拉丁字母、希臘字母、西里爾字母、亞美尼亞字母、希伯來字母、阿拉伯字母、敘利亞字母、泰米爾字母等在內(nèi)的幾乎所有的語言的字符。
- 基本原理:
- UTF-8 使用 8 位字節(jié)序列來表示一個 Unicode 字符。
- UTF-8 根據(jù)所表示的字符的不同范圍,使用不同長度的字節(jié)序列表示字符。
- 編碼范圍:
- 單字節(jié)編碼范圍:0x00-0x7F,與 ASCII 編碼完全兼容。
- 雙字節(jié)編碼范圍:0xC2-0xDF,0x80-0xBF。
- 三字節(jié)編碼范圍:0xE0-0xEF,0x80-0xBF,0x80-0xBF。
- 四字節(jié)編碼范圍:0xF0-0xF4,0x80-0xBF,0x80-0xBF,0x80-0xBF。
- 占位個數(shù):
- 對于單字節(jié)編碼的 ASCII 字符,占用一個字節(jié)(8 位)。
- 對于多字節(jié)編碼的 Unicode 字符,根據(jù)其在 Unicode 編碼中的范圍,使用 2 到 4 個字節(jié)(16 到 32 位)。
- 編碼規(guī)則:
- 對于單字節(jié)編碼的 ASCII 字符,其最高位是 0。
- 對于多字節(jié)編碼的 Unicode 字符,每個字節(jié)的最高位都是 1,緊跟著的一個 0 位表示該字節(jié)不是編碼的最后一個字節(jié)。
關(guān)于了解這些字符編碼特性的好處
常見的可用于JS的加密/解密,不同字符編碼之間的轉(zhuǎn)換等特性都可以用于JS加密,同樣可以用于JS逆向的邏輯中。
- 基本原理: