js值字符集編碼以及對其應用的理解

2021-07-30 04:31:58 字數 2551 閱讀 3476

最近一直在忙專案的事,就沒有更新了。

正好碰到編碼的問題,看的差不多就寫寫了。

首先得搞懂字符集和編碼的區別;(字符集定義的是碼點,即相應的值對應的字元;而編碼則是怎麼解析這些二進位制位數,具體的可以檢視

現在主要的字符集用的都是unicode和ascii字符集值,我今天也就主要講一下這兩種字符集。

先說一下字符集的由來:

計算機發明後,為了在計算機中表示字元,人們制定了一種編碼,叫ascii碼。ascii碼由乙個位元組中的7位(bit)表示,範圍是0x00 -

0x7f 共128個字元。

後來他們突然發現,如果需要按照**方式列印這些字元的時候,缺少了「製表符」。於是又擴充套件了ascii的定義,使用乙個位元組的全部8位(bit)來表示字元了,這就叫擴充套件ascii碼。範圍是0x00

- 0xff 共256個字元。 中國人利用連續2個擴充套件ascii碼的擴充套件區域(0xa0以後)來表示乙個漢字,該方法的標準叫gb-2312。後來,日文、韓文、阿拉伯文、台灣繁體(big-5)……都使用類似的方法擴充套件了本地字符集的定義,現在統一稱為

mbcs

字符集(多位元組字符集)。這個方法是有缺陷的,因為各個國家地區定義的字符集有交集,因此使用gb-2312的軟體,就不能在big-5的環境下執行(顯示亂碼),反之亦然。

為了把全世界人民所有的所有的文字元號都統一進行編碼,於是制定了unicode標準字符集。unicode

使用2個位元組表示乙個字元(unsigned shor

int、wchar、_wchar_t、olechar)。這下終於好啦,全世界任何乙個地區的軟體,可以不用修改地就能在另乙個地區執行了。雖然我用

ie 瀏覽日本**,顯示出我不認識的日文文字,但至少不會是亂碼了。unicode 的範圍是 0x0000 - 0xffff

共6萬多個字元(後來又擴充套件了2的5次方),其中光漢字就占用了4萬多個;

所以雖然有了這些對應的碼點,但是不同的環境下編碼格式又不一樣;

就比如在js中,\***這種格式的字元代表的就是ascii值,而\u***x代表的就是unicode值,這些都是人為規定出來的(剛開始的時候很糾結,它為什麼會是這樣呢,其實只是規定的一種形式罷了);而碼點所對應的值其實二進位制、八進位制、十六進製制都沒有關係,都是可以對映的;

十六進製制:  \u4f60\u597d\uff0c\u6781\u5ff5\u7f51\uff01

十進位制:你好,極念網!

有些人就想了,轉碼幹嘛呀,有什麼用處啊,正常情況下電腦不都根據我們的含義給轉換了嗎?有些環境下,特別是我們開發中,解析環境不同,就容易造成亂碼,所以才出現統一的編碼格式,那麼為什麼我們要在js檔案中,把漢字進行處理呢?因為如果單獨的js檔案中存在漢字,而正好js檔案本身的編碼格式和網頁檔案格式不一致,就很容易出現js亂碼現象。

說點題外話,其實本身看這些編碼並沒有什麼難的,把這些東西記住就ok了,難的其實是在應用中,我是在解決正規表示式對映的時候出現的這些問題,然後才來觀摩這些內涵知識的,哈哈

記幾點過程中的坑吧

1.js字串中的反斜槓其實代表著轉義,想要用就得\,要不然如果出現在字串裡面,應該是要直接轉義為unicode值的;如「\u2213」其實就代表著乙個字元;所以最後得看你想得到的究竟是那個字元「\u2213」->對應字元,還是這個編碼值「\u2213」->\u2213

2.在過程中想到乙個問題,現在想來也就想通了:假如我現在給了乙個二進位制的數,它代表的到底是什麼呢,乙個八進位制的數,十六進製制的,還是乙個ascii碼值?

其實答案是這樣的,其實這個二進位制數完全可以對應它所規定的這些值,只不過是看環境罷了,加入在計算機中,可能就解析成對應ascii的字元了呢,只是我們為了把它跟我們現實生活聯絡起來,所以才搞的各種對應關係而已;比如「\u1111」,」\u」是我們自己規定的;

6.各個進製之間的轉換規律

7.一位十六進製制的數等於四位二進位制的數。乙個位元組等於8位二進位制數;很簡單,因為16只能是4個二進位制數才可以表示啊,8進製也同理啊;

講了大半天的理論,都是個人的意見,其實猛的一看,可能對你也沒有什麼用處,這個只是個人在理解上的一些容易的誤區,自己探索;

接下來講一下js對於這些值的轉換吧;

主要用到了這三個charcodeat()【將字元轉化為unicode值】;

fromcharcode()【將unicode值轉化為字元】;

charat(i);找到第i位置上的字元

charcodeat()的引數其實並非什麼「\u」,只是它後面接的數而已;所以這個數可以是任何進製,只要你的字首寫明白就好;

fromcharcode()解析出來的也只是乙個數而已,需要你按照規則在前面新增「\u」;

其它的解析其實都是通過各自的規則呼叫這三個介面而已;說白了碰到unicode值都得通過這三個方法轉義,只是有時候可能規則不一樣,比如需要先正則找到「\u」,然後轉義後面的值;

所以說,真正的對應的值跟前面的這些什麼「\u」、」\x」什麼的並沒有什麼關係,它們只是乙個環境(比如js為了解析方便加上的而已);真正對應的只不過是那個對應的值而已;

以後看問題得分開看,這兩天把正則、字符集什麼的一塊兒看,好懵啊,現在清楚多了,哈哈哈,又很晚了,沒人了

Qt的字符集編碼以及轉換

qt 使用unicode編碼來儲存操作字串,但很多情況下,我們不得不處理採用其他編碼格式的資料,舉例來說,中文多採用gbk和big5編碼,而日本則多採用shift jis or iso2022編碼。本文將討論如何將其他編碼格式的字串轉化成採用unicode編碼的qstring method 1 qs...

對字符集和字元編碼的解析

3 ansi utf 8 utf 16le utf 16be區別 我記得有一次使用emwin的foncnv時,讀入pattern檔案,出現了好多字元無法識別,當時我就納悶了,我用的字型是是這種語言的編碼的,怎麼會無法識別,於是使用windows記事本開啟,檢查了下檔案屬性,發現該檔案是按照utf 8...

正規表示式中對各字符集編碼範圍的總結

字符集 日文字符集的各種字 標點以及特殊符號 utf8 x01 x7f xc0 xdf x80 xbf xe0 xef x80 xbf xf0 xff x80 xbf utf16 x00 xd7 xe0 xff xd8 xdf x00 xff jis x20 x7e x21 x5f x21 x7e ...