“锟斤拷”是一个在中文编码转换错误时经常出现的乱码字符。
不同字符编码系统之间转换时出现的错误
(特别是从Unicode编码转换为GBK等传统编码时)
这个乱码的产生与Unicode中的“替换字符”有关:
· Unicode中U+FFFD � 是“替换字符”,用于表示无法识别的字符
· 当U+FFFD被用UTF-8编码时,其字节序列是:0xEF 0xBF 0xBD
· 如果这个UTF-8字节序列被错误地用GBK编码解读,就会变成:
· 0xEF 0xBF → “锟”(GBK编码)
· 0xBD 0xEF → “斤”(GBK编码)
· 后续的0xBF 0xBD → “拷”(GBK编码)
· 统一使用UTF-8编码
· 在网页中明确指定字符集:
· 确保各个环节的编码一致性
· 在程序开发中正确处理字符串编码转换
运行以下代码,解出此文本的现编码和原编码,应用原编码,并将得出文本保存在当前文件夹:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 读取文件内容 content = "锝嶏綇锝咃絻锝旓絾锝涳讥锝庯迹锛愶絼锛戯綁锝庯絿锛匡絿锝傦极锛匡紶锝庯激锛匡嫉锝旓絾锛匡紭锛匡紤锝擄伎锛旓綍锝庯紒锛侊絽锝楋綏锝楋綏锝濇伃鍠滀綘寰楀埌寮楁媺鏍煎悗闈㈠叏鏄敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹"
# 首先,将当前字符串用GBK编码得到原始字节 original_bytes = content.encode('gbk', errors='ignore')
# 然后,用UTF-8解码这些字节 correct_text = original_bytes.decode('utf-8', errors='ignore')
# 输出正确文本 print(correct_text)
# 保存到当前文件夹的flag.txt中 with open('flag.txt', 'w', encoding='utf-8') as f: f.write(correct_text)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import chardet import codecs
def detect_and_convert_encoding(file_path): with open(file_path, 'rb') as f: raw_data = f.read()
result = chardet.detect(raw_data) detected_encoding = result['encoding'] confidence = result['confidence']
print(f"检测到的编码: {detected_encoding},置信度: {confidence}")
encoding_list = ['utf-8', 'gbk', 'gb2312', 'big5', 'utf-16', 'iso-8859-1'] original_encoding = None
for encoding in encoding_list: try: text = raw_data.decode(encoding) original_encoding = encoding break except UnicodeDecodeError: continue
if original_encoding: print(f"推测原本应该使用的编码: {original_encoding}") with codecs.open('decoded_file.txt', 'w', encoding=original_encoding) as f: f.write(raw_data.decode(original_encoding)) print("已将解码后的文本保存为decoded_file.txt") else: print("无法确定原本应该使用的编码,无法完成转换。")
if __name__ == "__main__": file_path = 'flag.txt' detect_and_convert_encoding(file_path)
|