网站建设网络推广公司,一键生成器,做网站用哪个软件,外贸 wordpress英文我们可能有时候在处理字符时需要处理到非ASCII的字符#xff0c;比如将表情、阿拉伯语转换为Unicode字符#xff0c;从而避免在传输时会出现乱码的情况。
Unicode验证网站#xff1a; unicode转换网站
目的#xff1a;转换下面除ASCII字符外的字符为Unicode字符#x1f…我们可能有时候在处理字符时需要处理到非ASCII的字符比如将表情、阿拉伯语转换为Unicode字符从而避免在传输时会出现乱码的情况。
Unicode验证网站 unicode转换网站
目的转换下面除ASCII字符外的字符为Unicode字符
é 19hmação nos stories!link一、encode方法
看过网上的一些技术文像以下方法
text 你好世界
escaped_text text.encode(unicode-escape)
print(escaped_text) # b\\u4f60\\u597d\\u4e16\\u754c上面的确实可以转换但表情却不行比如转换之后是\\U0001f525\\U0001f3b1 去掉转义符号测试一下没办法转换 而我们试试网站自身的编码同样也是乱码不能正常解析出来 这个方法显然不管用
二、高代理和低代理对处理方法
为了正确处理表情符号Unicode Supplementary Characters处理 Unicode 补充字符Supplementary Characters我们需要特别处理这些高代理和低代理对这些字符的编码范围在 0x10000 到 0x10FFFF 之间通常用于表示表情符号等。
高代理和低代理对surrogate pairs是 Unicode 用来编码超出基本多文种平面的字符的方法。基本多文种平面BMP, Basic Multilingual Plane包含从 0x0000 到 0xFFFF 的字符而超出这个范围的字符称为补充字符Supplementary Characters它们的代码点范围是从 0x10000 到 0x10FFFF。
由于 UTF-16 编码格式只能表示 0x0000 到 0xFFFF 范围内的字符为了表示超出这个范围的字符Unicode 引入了代理对的概念。代理对由两个 16 位的代码单元组成 高代理单元High Surrogate范围是 0xD800 到 0xDBFF包含 1024 个代码点。 低代理单元Low Surrogate范围是 0xDC00 到 0xDFFF也包含 1024 个代码点。
由于 UTF-16 不能直接表示这些字符所以需要使用代理对surrogate pairs
补充字符通常为表情符号编码值一般大于 0xFFFF即 65535
补充字符的处理
检查字符是否是补充字符
if code 0xFFFF:补充字符的编码值大于 0xFFFF即 65535。
计算高代理 high_surrogate 0xD800 ((code - 0x10000) 10)code - 0x10000将编码值减去 0x10000因为补充字符的编码范围是从 0x10000 开始的。 (code - 0x10000) 10将结果右移 10 位得到高 10 位的值。 0xD800 ...将高 10 位的值加上 0xD800高代理范围的起始值得到高代理的编码值。 3. 计算低代理
low_surrogate 0xDC00 ((code - 0x10000) 0x3FF)code - 0x10000将编码值减去 0x10000。 (code - 0x10000) 0x3FF将结果与 0x3FF 做按位与操作得到低 10 位的值。 0xDC00 ...将低 10 位的值加上 0xDC00低代理范围的起始值得到低代理的编码值。 返回高代理和低代理对的 Unicode 转义表示
return f\\u{high_surrogate:04x}\\u{low_surrogate:04x}\\u{high_surrogate:04x}将高代理的编码值格式化为 4 位的十六进制数并添加 Unicode 转义前缀 \u。 \\u{low_surrogate:04x}将低代理的编码值格式化为 4 位的十六进制数并添加 Unicode 转义前缀 \u。 通过这种方式我们可以将补充字符正确地转换为 Unicode 转义表示保证它们在 JSON 文件中能以 \uXXXX\uXXXX 的形式表示。
处理非ASCII字符
对于其他非ASCII字符编码值大于 127 且小于等于 0xFFFF直接格式化为 \uXXXX。
elif code 127:return f\\u{code:04x}保留 ASCII 字符
对于 ASCII 字符编码值小于等于 127则直接返回字符本身。
最终代码
unicode_str é 19hmação nos stories!linkdef encode_non_ascii_chars(input_str):def to_unicode_escape(char):code ord(char)# 处理补充字符补充字符通常是表情符号# 补充字符的 Unicode 编码范围在 0x10000 到 0x10FFFF 之间。因为 UTF-16 不能直接表示这些字符所以需要使用代理对surrogate pairsif 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字符# 对于其他非ASCII字符编码值大于 127 且小于等于 0xFFFF直接格式化为 \uXXXX。elif code 127: # non-ASCIIreturn f\\u{code:04x}# 对于 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可正常转换
推荐文章
2024 最新 GPT4、GPT4.0 升级教程ChatGPT 升级银行卡被拒绝教你 5 分钟快速升级 chatgpt4