如何正确将文本编码为UTF-16BE并转换为对应十六进制字符串
概念差异说明
- 执行
"ABC".encode(encoding="utf-16be")得到的b'\x00A\x00B\x00C'是无BOM的UTF-16大端编码,对应十六进制字符串就是004100420043,和Adobe文档里ABC三个字符本身的编码完全一致,不存在错误。 - 文档示例中开头的
FEFF是UTF-16编码的字节顺序标记(BOM),作用是显式声明当前文本使用大端序UTF-16编码,不属于ABC三个字符的内容本身。utf-16be编码默认不会附带BOM头,这就是输出结果和示例看起来有差异的核心原因。
转换实现方法
生成Adobe示例要求的带BOM字节序列
Python中utf-16编码默认跟随系统字节序,可能输出小端带FFFE头的结果,最稳妥的方式是手动拼接UTF-16大端BOM头:
# 定义UTF-16大端BOM UTF16_BE_BOM = b'\xFE\xFF' # 先得到文本本身的无BOM编码 content_bytes = "ABC".encode(encoding="utf-16-be") # 拼接得到完整带BOM的字节序列 full_bytes = UTF16_BE_BOM + content_bytes # 验证结果 print(full_bytes) # 输出 b'\xfe\xff\x00A\x00B\x00C',和目标字节完全匹配
字节序列转大写连续十六进制字符串
直接调用Python字节类型内置的hex()方法,再转大写即可匹配Adobe文档的格式:
# 带BOM的字节序列转目标十六进制字符串 hex_with_bom = b'\xFE\xFF\x00\x41\x00\x42\x00\x43'.hex().upper() print(hex_with_bom) # 输出 FEFF004100420043 # 仅提取字符本体的十六进制字符串 hex_content_only = "ABC".encode(encoding="utf-16-be").hex().upper() print(hex_content_only) # 输出 004100420043
注意:pdfmark书签的Unicode文本要求必须带
FEFF开头的BOM标记,否则会被解析器识别为其他编码导致乱码。
内容的提问来源于stack exchange,提问作者Xaver
相关产品推荐
相关产品推荐

