python - 处理包含多个字符编码的字符串

标签 python string unicode encoding

我不太确定如何真正提出这个问题,而且我离找到答案还差得很远,所以我希望有人能帮助我。

我正在编写一个连接到远程主机并接收返回字节数据的 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/

相关文章:

c - 弹出一堆 char* 以创建一个新字符串并返回它

entity-framework - 带有 Entity Framework 的 Unicode

python - 从字典列表到具有相同值的字典列表列表

Python 查找区间的连续交集

c# 将一个字符串从一个 Action 传递到另一个 Action

python - undefined symbol : PyUnicodeUCS2_Decode

android - Android 是否支持所有 Unicode 字符

python - 在pygame中的透明表面上渲染抗锯齿文本

python - 将数据保存到两个独立的 Parse 应用程序中

java - JComboBox 设置一个字符串,然后该字符串返回 null