[note] Unicode 字串編碼(encode, decode)
keywords: unicode
, encode
, decode
, escape
, sequence
, 代理編碼
此文章為各筆記之整理,非原創,擷取來源可見參考資料:
- 工具:全字庫:方便查詢 Unicode
- 字符編碼筆記:ASCII,Unicode 和 UTF-8 @ 阮一峰的網絡日誌
- Unicode 與 JavaScript 詳解 @ 阮一峰的網絡日誌
- Javascript Unicode @ Andyyou
重點總結(tl;dr)
- 一個位元組(byte)由 8 個位元(bit)組成,每個位元都是二進制的,共可表徵 255 種狀態。
- 一個位元組可以用 2 個位數的十六進制表示。
- Unicode 的代碼點(Code Point)大多是以
U+
作為前綴,後面放十六進位制,例如,U+0041
即表示文字符號A
。 0x
,0o
前綴的內容,其型態仍然是數值。- 在 JS 中,看到
0x
,0o
的前輟表示為 Unicode 十六進位制和八進位制的碼點,可以透過String.fromCodePoint()
轉換成字符,例如0x0041
。 - 在 JS 中,看到
\x
,\u
,\u{}
的前輟均為U+
碼點的字串跳脫表示法,可以直接透過console.log('')
輸入即會產生文字符號 ,例如\x41
或\u0041
。 - 在 CSS 中,看到
\
的前輟亦表示 Unicode 十六進位制,可以將它改成\u<hex>
在console
輸入即可看到結果,例如\0041
。 - 在 HTML 或 URI 中,看到以
%
作為前綴通常是將特殊字元轉成 UTF-8,可以透過decodeURI()
或decodeURIComponent()
反解回來。 - 在 HTML 中,看到以
&
開頭,以;
結束,表示透過 HTML Encode 編碼過。 - ASCII Code 的十六進位制,會對應到相同的 Unicode 十六進位制,以及相同的 UTF-16 十六進位制。
- 查詢某一文字符號的編碼可到 unicode.scarfboy.com。
- 進制轉換:
// 轉成 10 進制,可以直接輸入不用使用 Number()
0xfe; // 254
Number('0xfe')(
// 254
// 10 進制轉成其他進制
254,
)
.toString(16)(
// "fe",轉成 16 進制
254,
)
.toString(2); // "11111110",轉成 2 進制
其實可以不用加上
Number()
直接輸入0xfe
即可。
- 碼點與文字轉換:
// 根據碼點轉為文字,使用數值
String.fromCodePoint(0x41); // "A"
String.fromCodePoint(65); // "A"
// 根據碼點轉為文字:使用跳脫字符
// \x<兩位碼點>,只使用到 ASCII
// \u<四位碼點>,只使用到 Unicode 基本平面
// \u{碼點},使用到 Unicode 輔助平面
console.log('\x41'); // "A"
console.log('\u0041'); // "A"
console.log('\u{41}'); // "A"
console.log('\u{0041}'); // "A"
// 根據文字轉回碼點
const character = 'A';
character
.codePointAt()(
// 65
65,
)
.toString(16); // 0x41
進位制
進位制的表示法
keywords: bin
, oct
, dec
, hex
進位制(縮寫) | 前綴法 | 首字法 | 下標表示法 | HTML 表示法 |
---|---|---|---|---|
二進位(Binary;bin) | 0b 11111110 | 11111110b | (11111110)2 | |
八進位(Octal;oct) | 0 376, 0o 376 | 376o | (376)8 | |
十進位(Decimal;dec) | 254 | 254d | (254)10 | |
十六進位(Hexadecimal;hex) | 0x fe | feh | (fe)16 | &#x 5a3; |
- 在 HTML ,十六進制可以用
x
表示,例如֣
和֣
相同,5a3
是 16 進制,轉成 10 進制後就是1443
。
在 HTML 中常用
&
開頭;
結尾當作一種編碼方式。
位元(bit)與位元組(byte)
keywords: bit
, byte
- 位元(bit):1 個二進制的值稱作一個位元(bit),全名是 binary digit,有
0
和1
兩種狀態。 - 位元組(byte):8 個二進制位元,組成一個位元組(byte),從
00000000
到11111111
,共可表徵 255 種狀態。在中國位元組稱作字節。
/**
* 1 個位元組(byte)包含 8 個位元的二進制,可以用兩位數的十六進制值表示
**/
0b11111111; // 255
Number('0b11111111'); // 255, 11111111b 等同於 255d
(255).toString(16); // 'ff'
- 一個位元組(byte)由 8 個位元(bit)組成,每個位元都是二進制的,共可表徵 255 種狀態,並且可用 2 位數的十六進制表示。
- 留意位元和位數的差別,位元均是由二進制組成,而位數是指該數值需要使用幾個位數。
使用 JS 進行進位制轉換
New number and Math features in ES6 @ 2ality
轉換成 10 進位
keywords: Number
, parseInt
// 內容需要以前綴法表示
254; // 254,直接帶入就是 10 進制
0376; // 254,以舊八進制的前綴法表示
0o376; // 254,以新的八進制的前綴法表示
0xfe; // 254,以十六進制的的前綴法表示
0b11111110; // 254,以二進制的 的前綴法表示
Number('0b11111110'); // 如果要用字串的話可以加上 Number()
// 指定該內容要使用的進位制
parseInt('fe', 16); // 254, 0xfe = 254
parseInt('376', 8); // 254, 0o376 = 254
parseInt('11111110', 2); // 254, 0b11111110 = 254
其實可以不用加上
Number()
直接輸入0xf4
等等即可。
10 進位轉換成其他進位
keywords: toString
// 10 進位轉成 16 進位
(254).toString(16); // "fe",0xfe = 254
ASCII(美國資訊交換標準碼)
keywords: symbol
, 文字符號
美國制定了一套字符編碼,用來定義英語字母與二進制之間的關係,這被稱為 ASCII 碼。
ASCII 碼一共規定了 128 個字符的編碼,比如空格 SPACE
是 32,也就是 (00100000)2;大寫的字母 A
是 65,也就是 (01000001)2。
這 128 個符號(包括 32 個不能打印出來的控制符號),只佔用了一個位元組的後面 7 位,最前面的一位統一規定為 0
。
在後面的文章把所有語言的單字,稱為文字符號、符號或字符(Symbol),例如英文的
a
;中文的國
; 法文的é
;阿拉伯文的Ain
。
ASCII 碼是美國最早用來定義二進制文字符號(Symbol)間對應關係的表。