文本文件中存储了下列二进制字符:
AAAAOOA0:/TACT/OpenSouce/X0A000/\x8F\x88\x97\x9D\x92\x86IF\x83G\x83\x89\x81[\x8C\x9F\x92m_\x95?W\x8A?\x9D:@00E000
需求:将这些二进制字符串转化为标准字符串。
通常做法:以二进制方式(rb)读取文件内容,再转码。
import os
abs_path = os.getcwd()
path = abs_path + "\\Desktop\\input.txt"
with open(path, 'rb') as rd_stream:
message = rd_stream.read()
print("变更前:-----------------")
print(message)
cvt_message = message.decode('shift_jis')
print("变更后:-------------------")
print(cvt_message)
结果如下:
变更前:-----------------
b'AAAAOOA0:/TACT/OpenSouce/X0A000/\\x8F\\x88\\x97\\x9D\\x92\\x86IF\\x83G\\x83\\x89\\x81[\\x8C\\x9F\\x92m_\\x95?W\\x8A?\\x9D:@00E000'
变更后:-------------------
AAAAOOA0:/TACT/OpenSouce/X0A000/\x8F\x88\x97\x9D\x92\x86IF\x83G\x83\x89\x81[\x8C\x9F\x92m_\x95?W\x8A?\x9D:@00E000
这里出现了很重要的问题:
Python自动将文件中的反斜杠(\)转义成两个反斜杠(\\)了!
导致最后的转码结果不正确。
所以,解决问题的一个关键点就是不让Python自动转义反斜杠!
解决方案:
import os
abs_path = os.getcwd()
path = abs_path + "\\Desktop\\input.txt"
with open(path, 'r', encoding="utf-8") as rd_stream:
message = rd_stream.read()
print("変更前:-----------------")
print(message)
print("変更後:-------------------")
import codecs
# "hex-escape"表示关闭自动转义
original = codecs.escape_decode(message, 'hex-escape')
print(original[0].decode("shift_jis", 'ignore'))
输出结果:
変更前:-----------------
AAAAOOA0:/TACT/OpenSouce/X0A000/\x8F\x88\x97\x9D\x92\x86IF\x83G\x83\x89\x81[\x8C\x9F\x92m_\x95?W\x8A?\x9D:@00E000
変更後:-------------------
AAAAOOA0:/TACT/OpenSouce/X0A000/処理中IFエラー検知_?W?:@00E000
问题得以解决。