我不太确定如何真正提出这个问题,而且我离找到答案还差得很远,所以我希望有人能帮助我。
我正在编写一个连接到远程主机并接收返回字节数据的 Python 应用程序,我使用 Python 的内置结构模块解压缩这些数据。我的问题是字符串,因为它们包含多种字符编码。以下是此类字符串的示例:
“^L这是一个示例 ^Gstring 与多个 ^Jcharacter 编码”
使用特殊转义字符标记不同编码的开始和结束位置:
- ^L - 拉丁语1
- ^E - 中欧
- ^T - 土耳其语
- ^B - 波罗的海
- ^J - 日语
- ^C - 西里尔文
- ^G - 希腊语
等等...我需要一种方法将这种字符串转换为 Unicode,但我真的不确定该怎么做。我已经阅读了 Python 的编解码器和 string.encode/decode,但我真的一点也不聪明。我还应该提到,我无法控制主机输出字符串的方式。
我希望有人能帮助我了解如何开始这件事。
最佳答案
这里有一个相对简单的例子来说明如何做...
# -*- coding: utf-8 -*-
import re
# Test Data
ENCODING_RAW_DATA = (
('latin_1', 'L', u'Hello'), # Latin 1
('iso8859_2', 'E', u'dobrý večer'), # Central Europe
('iso8859_9', 'T', u'İyi akşamlar'), # Turkish
('iso8859_13', 'B', u'Į sveikatą!'), # Baltic
('shift_jis', 'J', u'今日は'), # Japanese
('iso8859_5', 'C', u'Здравствуйте'), # Cyrillic
('iso8859_7', 'G', u'Γειά σου'), # Greek
)
CODE_TO_ENCODING = dict([(chr(ord(code)-64), encoding) for encoding, code, text in ENCODING_RAW_DATA])
EXPECTED_RESULT = u''.join([line[2] for line in ENCODING_RAW_DATA])
ENCODED_DATA = ''.join([chr(ord(code)-64) + text.encode(encoding) for encoding, code, text in ENCODING_RAW_DATA])
FIND_RE = re.compile('[\x00-\x1A][^\x00-\x1A]*')
def decode_single(bytes):
return bytes[1:].decode(CODE_TO_ENCODING[bytes[0]])
result = u''.join([decode_single(bytes) for bytes in FIND_RE.findall(ENCODED_DATA)])
assert result==EXPECTED_RESULT, u"Expected %s, but got %s" % (EXPECTED_RESULT, result)
关于python - 处理包含多个字符编码的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/197759/