網(wǎng)站的注冊(cè)頁(yè)面怎么做黃頁(yè)88網(wǎng)
我們可能有時(shí)候在處理字符時(shí)需要處理到非ASCII的字符,比如將表情、阿拉伯語(yǔ)轉(zhuǎn)換為Unicode字符,從而避免在傳輸時(shí)會(huì)出現(xiàn)亂碼的情況。
Unicode驗(yàn)證網(wǎng)站:
unicode轉(zhuǎn)換網(wǎng)站
目的:轉(zhuǎn)換下面除ASCII字符外的字符為Unicode字符👇
🔥🎱é🕐 19h📱ma??o nos stories!link
一、encode方法
看過(guò)網(wǎng)上的一些技術(shù)文,像以下方法
text = "你好世界"
escaped_text = text.encode('unicode-escape')
print(escaped_text) # b'\\u4f60\\u597d\\u4e16\\u754c'
上面的確實(shí)可以轉(zhuǎn)換,但表情卻不行,比如"🔥🎱",轉(zhuǎn)換之后是\\U0001f525\\U0001f3b1
去掉轉(zhuǎn)義符號(hào)測(cè)試一下,沒(méi)辦法轉(zhuǎn)換
而我們?cè)囋嚲W(wǎng)站自身的編碼,同樣也是亂碼,不能正常解析出來(lái)
這個(gè)方法顯然不管用
二、高代理和低代理對(duì)處理方法
為了正確處理表情符號(hào)(Unicode Supplementary Characters),處理 Unicode 補(bǔ)充字符(Supplementary Characters),我們需要特別處理這些高代理和低代理對(duì),這些字符的編碼范圍在 0x10000 到 0x10FFFF 之間,通常用于表示表情符號(hào)等。
高代理和低代理對(duì)(surrogate pairs)是 Unicode 用來(lái)編碼超出基本多文種平面的字符的方法。基本多文種平面(BMP, Basic Multilingual Plane)包含從 0x0000 到 0xFFFF 的字符,而超出這個(gè)范圍的字符稱為補(bǔ)充字符(Supplementary Characters),它們的代碼點(diǎn)范圍是從 0x10000 到 0x10FFFF。
由于 UTF-16 編碼格式只能表示 0x0000 到 0xFFFF 范圍內(nèi)的字符,為了表示超出這個(gè)范圍的字符,Unicode 引入了代理對(duì)的概念。代理對(duì)由兩個(gè) 16 位的代碼單元組成:
-
高代理單元(High Surrogate):范圍是 0xD800 到 0xDBFF,包含 1024 個(gè)代碼點(diǎn)。
-
低代理單元(Low Surrogate):范圍是 0xDC00 到 0xDFFF,也包含 1024 個(gè)代碼點(diǎn)。
由于 UTF-16 不能直接表示這些字符,所以需要使用代理對(duì)(surrogate pairs)
補(bǔ)充字符通常為表情符號(hào),編碼值一般大于 0xFFFF(即 65535)
補(bǔ)充字符的處理
- 檢查字符是否是補(bǔ)充字符:
if code > 0xFFFF:
補(bǔ)充字符的編碼值大于 0xFFFF(即 65535)。
- 計(jì)算高代理:
high_surrogate = 0xD800 + ((code - 0x10000) >> 10)
code - 0x10000
:將編碼值減去 0x10000,因?yàn)檠a(bǔ)充字符的編碼范圍是從 0x10000 開(kāi)始的。
(code - 0x10000) >> 10
:將結(jié)果右移 10 位,得到高 10 位的值。
0xD800 + ...
:將高 10 位的值加上 0xD800(高代理范圍的起始值)得到高代理的編碼值。
3. 計(jì)算低代理:
low_surrogate = 0xDC00 + ((code - 0x10000) & 0x3FF)
code - 0x10000
:將編碼值減去 0x10000。
(code - 0x10000) & 0x3FF
:將結(jié)果與 0x3FF 做按位與操作,得到低 10 位的值。
0xDC00 + ...
:將低 10 位的值加上 0xDC00(低代理范圍的起始值)得到低代理的編碼值。
返回高代理和低代理對(duì)的 Unicode 轉(zhuǎn)義表示:
return f'\\u{high_surrogate:04x}\\u{low_surrogate:04x}'
\\u{high_surrogate:04x}
:將高代理的編碼值格式化為 4 位的十六進(jìn)制數(shù),并添加 Unicode 轉(zhuǎn)義前綴 \u。
\\u{low_surrogate:04x}
:將低代理的編碼值格式化為 4 位的十六進(jìn)制數(shù),并添加 Unicode 轉(zhuǎn)義前綴 \u。
通過(guò)這種方式,我們可以將補(bǔ)充字符正確地轉(zhuǎn)換為 Unicode 轉(zhuǎn)義表示,保證它們?cè)?JSON 文件中能以 \uXXXX\uXXXX 的形式表示。
處理非ASCII字符:
對(duì)于其他非ASCII字符(編碼值大于 127 且小于等于 0xFFFF),直接格式化為 \uXXXX。
elif code > 127:return f'\\u{code:04x}'
保留 ASCII 字符:
對(duì)于 ASCII 字符(編碼值小于等于 127),則直接返回字符本身。
最終代碼
unicode_str = '🔥🎱é🕐 19h📱ma??o nos stories!link'def encode_non_ascii_chars(input_str):def to_unicode_escape(char):code = ord(char)# 處理補(bǔ)充字符(補(bǔ)充字符,通常是表情符號(hào))# 補(bǔ)充字符的 Unicode 編碼范圍在 0x10000 到 0x10FFFF 之間。因?yàn)?UTF-16 不能直接表示這些字符,所以需要使用代理對(duì)(surrogate pairs)if code > 0xFFFF: # Supplementary charactershigh_surrogate = 0xD800 + ((code - 0x10000) >> 10)low_surrogate = 0xDC00 + ((code - 0x10000) & 0x3FF)return f'\\u{high_surrogate:04x}\\u{low_surrogate:04x}'# 處理非ASCII字符# 對(duì)于其他非ASCII字符(編碼值大于 127 且小于等于 0xFFFF),直接格式化為 \uXXXX。elif code > 127: # non-ASCIIreturn f'\\u{code:04x}'# 對(duì)于 ASCII 字符(編碼值小于等于 127),直接返回字符本身else:return charreturn ''.join(to_unicode_escape(char) for char in input_str)encoded_str = encode_non_ascii_chars(unicode_str)
print(encoded_str) # \ud83d\udd25\ud83c\udfb1\u00e9\ud83d\udd50 19h\ud83d\udcf1ma\u00e7\u00e3o nos stories!link
可正常轉(zhuǎn)換
推薦文章:
(2024 最新 GPT4、GPT4.0 升級(jí)教程)ChatGPT 升級(jí)銀行卡被拒絕,教你 5 分鐘快速升級(jí) chatgpt4