“锟斤拷”是一个在中文编码转换错误时经常出现的乱码字符

  • 锟斤拷通常出现在:

不同字符编码系统之间转换时出现的错误

特别是从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()

# 使用chardet检测文件编码
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)