将差劣的文本转换为韩文。

8

问题

我正在清理一些旧的韩语代码,有些代码部分曾经是韩语,我想把它们翻译成英语。但是,似乎存在编码问题,文本不再是韩语,而是一堆乱码。

我希望能够从这段破碎的字符串转换成英语翻译。

我的计划是从这个破碎的字符串开始,使用在我的电脑上解码这个破碎字符串的编解码器将其编码为二进制,然后使用韩国编解码器将该二进制解码为韩语,并使用Google翻译将该韩语翻译成英语。问题是我不知道如何将这个混乱的乱码解码成可读的韩语。

我尝试过的方法

我开始写一些Python3代码来翻译它,但我一直遇到编码错误,老实说,我不知道从哪里开始。这段代码假设韩语使用cp949编解码器,但我不确定。

fileIn = open('Broken_Korean.txt', 'r', encoding='cp949')
fileOut = open('Fixed_Korean.txt', 'w')

Lines = fileIn.readlines()
for line in Lines:
    fileOut.write(str(line.encode('cp949')))
    fileOut.write('\n')
    fileOut.write(line.encode('cp949').decode('utf-8'))

我也研究了这个问题,但没有找到任何突破性的发现。我认为用于显示损坏字符串的编解码器是UTF-8,但我可能错了。我不知道原来的韩文是如何书写的,除了它使用了“多字节编码方案(MBCS)”。 为了背景,此程序是LabVIEW 2015编写的。假设在编写初始代码时他们使用的是韩文版。

以下是一些损坏字符串的示例:

ÆÄÀÏ ´ëÈ­ »óÀÚ5

ÆÄÀÏ ´ëÈ­ »óÀÚ6

ÆÄÀÏ ´ëÈ­ »óÀÚ

幸运的是,其中一些编码错误发生在枚举中,因此我能够找到英语翻译。 使用这个翻译,我可以猜测韩国可能是什么,但我不确定。 我认为这可能有助于我推断所使用的编解码器,但我不知道该怎么做。

À¯ÇÑ »ùÇà = 有限样本 > 유한 샘플

¿¬¼Ó »ùÇà = 连续样本 > 연속 샘플

Çϵå¿þ¾î ŸÀֿ̹¡ ÀÇÇÑ ´ÜÀÏ Æ÷ÀÎÆ® = 硬件定时单点 > 하드웨어 타이밍 단일 포인트

任何关于编码的帮助或解决此问题的提示都将不胜感激!我现在非常迷失。

编辑: 以下是一些损坏字符串的十六进制转储:

Broken_Korean.txt

ÆÄÀÏ ´ëÈ­ »óÀÚ5
ÆÄÀÏ ´ëÈ­ »óÀÚ6
ÆÄÀÏ ´ëÈ­ »óÀÚ
À¯ÇÑ »ùÇÃ
¿¬¼Ó »ùÇÃ
Çϵå¿þ¾î ŸÀֿ̹¡ ÀÇÇÑ ´ÜÀÏ Æ÷ÀÎÆ®

hexdump -C Broken_Korean.txt                                       
000000  c3 86 c3 84 c3 80 c3 8f 20 c2 b4 c3 ab c3 88 c2  ........ .......                                               
000010  ad 20 c2 bb c3 b3 c3 80 c3 9a 35 0d 0a c3 86 c3  . ........5.....                                               
000020  84 c3 80 c3 8f 20 c2 b4 c3 ab c3 88 c2 ad 20 c2  ..... ........ .                                               
000030  bb c3 b3 c3 80 c3 9a 36 0d 0a c3 86 c3 84 c3 80  .......6........                                               
000040  c3 8f 20 c2 b4 c3 ab c3 88 c2 ad 20 c2 bb c3 b3  .. ........ ....                                               
000050  c3 80 c3 9a 0d 0a c3 80 c2 af c3 87 c3 91 20 c2  .............. .                                               
000060  bb c3 b9 c3 87 c3 83 0d 0a c2 bf c2 ac c2 bc c3  ................                                               
000070  93 20 c2 bb c3 b9 c3 87 c3 83 0d 0a c3 87 c3 8f  . ..............                                               
000080  c2 b5 c3 a5 c2 bf c3 be c2 be c3 ae 20 c3 85 c2  ............ ...                                               
000090  b8 c3 80 c3 8c c2 b9 c3 96 c2 bf c2 a1 20 c3 80  ............. ..                                               
0000a0  c3 87 c3 87 c3 91 20 c2 b4 c3 9c c3 80 c3 8f 20  ...... ........                                                
0000b0  c3 86 c3 b7 c3 80 c3 8e c3 86 c2 ae              ............     


1
我尝试解码 ÆÄÀÏ ´ëÈ­ »óÀÚ5,但是出现了 UnicodeEncodeError: 'cp949' codec can't encode character '\xc7' in position 0: illegal multibyte sequence 的错误。你是否遇到了同样的问题?(其他字符串也会出现这种情况) - Razzle Shazl
3
你能否发布一份示例文本的十六进制转储? - SuperStormer
1
我知道朝鲜创建了自己的操作系统“红星操作系统”,并且拥有大量内部开发。可能他们想出了自己的古老编码方式,这是你所发现的吗?只是猜测。 - Razzle Shazl
2
我认为你需要一个文件的十六进制转储。你现在拥有的是使用错误编解码器对韩文注释(来自源文件)进行解码后的字节的十六进制转储,然后重新保存到一个名为“Broken_Korean.txt”的新文件中。也许有人会纠正我。 - Razzle Shazl
2
无论如何,这样做应该比不正确的重新编码的十六进制转储更有帮助。 - SuperStormer
显示剩余8条评论
1个回答

5

十六进制转储中的数据可能被读为ISO-8859-1(又称Latin-1),并重新保存为UTF-8。 要进行反向操作,需将其解码为UTF-8,以获得原始的cp939字节值,但表示为Unicode代码点的Unicode字符串。 latin1编解码器占据前256个代码点,并使用它进行编码可生成具有相同字节值的字节字符串。 然后,在应用正确的编解码器进行解码回Unicode字符串:

data = bytes.fromhex('''
c3 86 c3 84 c3 80 c3 8f 20 c2 b4 c3 ab c3 88 c2
ad 20 c2 bb c3 b3 c3 80 c3 9a 35 0d 0a c3 86 c3
84 c3 80 c3 8f 20 c2 b4 c3 ab c3 88 c2 ad 20 c2
bb c3 b3 c3 80 c3 9a 36 0d 0a c3 86 c3 84 c3 80
c3 8f 20 c2 b4 c3 ab c3 88 c2 ad 20 c2 bb c3 b3
c3 80 c3 9a 0d 0a c3 80 c2 af c3 87 c3 91 20 c2
bb c3 b9 c3 87 c3 83 0d 0a c2 bf c2 ac c2 bc c3
93 20 c2 bb c3 b9 c3 87 c3 83 0d 0a c3 87 c3 8f
c2 b5 c3 a5 c2 bf c3 be c2 be c3 ae 20 c3 85 c2
b8 c3 80 c3 8c c2 b9 c3 96 c2 bf c2 a1 20 c3 80
c3 87 c3 87 c3 91 20 c2 b4 c3 9c c3 80 c3 8f 20
c3 86 c3 b7 c3 80 c3 8e c3 86 c2 ae
''')

fixed = data.decode('utf8').encode('latin1').decode('cp949')
print(fixed)

输出:

파일 대화 상자5
파일 대화 상자6
파일 대화 상자
유한 샘플
연속 샘플
하드웨어 타이밍에 의한 단일 포인트

Sorry, 我只能使用英文回答问题。
File Dialog 5
File Dialog 6
File dialog
Finite sample
Continuous sample
Single point by hardware timing

如果从文件开始,将文件作为UTF-8读取,应用修复并将其作为(正确的)UTF-8写回:
with open('Broken_Korean.txt', 'r', encoding='utf8') as f:
    data = f.read().encode('latin1').decode('cp949')

with open('Fixed_Korean.txt', 'w', encoding='utf8') as f:
    f.write(data)

哇!!你是怎么确定它是 Latin-1 编码的? - Zico
2
@Zico 这不是必须的。只是在解码后,你得到了一个Unicode字符串,但它需要成为一个字节字符串才能再次解码,而.encode('latin1')将代码点X(其中X是U+0000到U+00FF)转换为字节X(0x00到0xFF)。前256个Unicode代码点是Latin-1字符集。这通常是第一次尝试,因为它可以解码任何东西。有时它需要是cp1252(Windows上的ANSI默认值)。 - Mark Tolonen
1
这太神奇了。我用它来找到一首在一个不支持编码的网络电台上播放的歌曲的名字。字符串¹Ú¼öÁø - ´Ã »ì¾Æ°è½Ã³×转换成了박수진 - 늘 살아계시네。真是疯狂。 - WEBjuju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接