从 linux 编码解码阿拉伯字符

Decode Arabic chars from a linux encoding

我正在处理我在 Linux 服务器上找到的旧文件,该文件包含以下奇怪格式的阿拉伯语单词。

030747517\...

如果 Linux 自动转换阿拉伯字符或有人自己转换,我不会,但我需要理解以这种方式编写的阿拉伯语。

所以,有谁知道上面的format/encoding是什么?

提前致谢。

我不懂阿拉伯语,但我可以提供一些推测,希望至少能提供足够的信息让你完成识别任务。

您在问题中显示的字符串看起来像八进制字符代码,即 Emacs 如何将包含这些字符的文件显示为字节。将它们转换为十六进制收益率

bash$ python
>>> print([hex(ord(x)) for x in '030747517'])
['0xe8', '0xe3', '0xa0', '0xcf', '0xe4', '0xc7', '0xe5', '0xd9', '0xc7']

https://tripleee.github.io/8bit/ 上查找这些并寻找(可能)阿拉伯字形让我明白了

(披露:如果不明显,链接页面是我的。)

我可以继续,但由于我无法判断哪些组合会产生有效的阿拉伯语文本,所以我会留给您继续调查。到目前为止,这里挑选出最合适的候选者,看看哪些被解码为有意义的东西:

>>> print(b'030747517'.decode('cp720'))
كعب╧غ╟ف┘╟
>>> #   ^ partial gibberish, so probably no
>>> print(b'030747517'.decode('iso8859_6'))
وك دلامعا

(Google 翻译让我对这段文字感到“你在流泪”,所以看起来有点前途。)

Windows code page 720 is native to Windows, but it's of course possible that it was popular for other platforms at some point in time in some region; but that's another reason to regard it as less likely than the actually standard ISO 8859-6 编码,所以至少根据目前的证据,我真的会选择它。

要将整个文件从该编码转换为 UTF-8(或您系统上的默认设置),请尝试

iconv -f iso-8859-6 file.txt >new.txt

如果您的原始文件包含与我假设不同的内容,或许可以编辑您的问题以进行澄清。另见 character-encoding tag info page on Stack Overflow and Problematic questions about decoding errors

如果您的文件包含 文字 反斜杠和数字,请尝试

#!/usr/bin/env python3
from sys import stdin
for line in stdin:
    bline = bytes(int(x, 8) for x in line.rstrip('\n').split('\')[1:])
    print(bline.decode('iso-8859-6'))

这个不用专门用Python,就是我自己用的,方便,也广为人知。

作为一个快速的旋风式总结,bytes 和相应的 b'...' 字节字符串是 Python 没有编码的二进制数据类型;它们只是代表文字 8 位二进制字节。对文本字符串进行编码需要您指定编码并生成 bytes;在另一个方向上将 bytesb'...' 字符串转换为实际字符串(在 Python 3 中始终是 Unicode),同样是不同的字符串(或错误),具体取决于哪种编码你通过了。

int(str, base)str 转换为以 base 为基数的整数,例如,int("345", 8) 将八进制 345 转换为十进制 229(十六进制 0xe5)。

这个简单的脚本只是从标准输入读取并写入标准输出。如果你需要这个不仅仅是一次性的,可以添加一个选项解析器来接受文件名参数等。