如何直接获取UTF-16代码单元列表及反向转UTF-8?
UTF-8与UTF-16代码单元的互转方案
1. 从UTF-8字节串获取UTF-16代码单元整数列表
要直接得到UTF-16代码单元的整数列表,核心是先将UTF-8解码为Unicode字符串(这是绕不开的中间步骤,因为UTF-8和UTF-16都是基于Unicode的编码方案),再将字符串转换为UTF-16编码的字节串,最后把每两个字节(UTF-16 BE的单代码单元长度)转换为16位整数。
示例代码:
# 原始UTF-8字节串 utf8_bytes = b'ab\xc3\xa7' # 解码为Unicode字符串 unicode_str = utf8_bytes.decode('utf-8') # 转换为UTF-16 BE字节串 utf16_be_bytes = unicode_str.encode('utf-16-be') # 每两个字节转换为一个UTF-16代码单元(16位整数) utf16_code_units = [ int.from_bytes(utf16_be_bytes[i:i+2], byteorder='big') for i in range(0, len(utf16_be_bytes), 2) ] print(utf16_code_units) # 输出: [97, 98, 231]
注:你提到的[32, 33, 327]应为笔误,实际对应字符a/b/ç的UTF-16代码单元十进制值是97、98、231。
2. 将UTF-16代码单元整数列表转回UTF-8编码
反向转换的逻辑是先把每个16位代码单元转回UTF-16 BE字节串,解码为Unicode字符串后再编码为UTF-8。
示例代码:
# UTF-16代码单元整数列表 utf16_code_units = [97, 98, 231] # 将每个代码单元转换为2字节的大端字节串并拼接 utf16_be_bytes = b''.join([ cu.to_bytes(2, byteorder='big') for cu in utf16_code_units ]) # 解码为Unicode字符串 unicode_str = utf16_be_bytes.decode('utf-16-be') # 编码为UTF-8字节串 utf8_bytes = unicode_str.encode('utf-8') print(utf8_bytes) # 输出: b'ab\xc3\xa7'
内容的提问来源于stack exchange,提问作者Andy Jewell
相关产品推荐
相关产品推荐

