Ale*_*ide 9 python string unicode encoding
我不确定如何真正地提出这个问题,而且我找不到答案,所以我希望有人可以帮助我.
我正在编写一个连接到远程主机并接收返回字节数据的Python应用程序,我使用Python的内置结构模块解压缩.我的问题在于字符串,因为它们包含多个字符编码.以下是此类字符串的示例:
"^ LT这是一个带有多个^ Jcharacter编码的^ Gstring"
使用特殊的转义字符标记不同的编码开始和结束的位置:
等等...我需要一种方法将这种字符串转换为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)
Run Code Online (Sandbox Code Playgroud)
没有用于解码这样的字符串的内置功能,因为它实际上是它自己的自定义编解码器。您只需根据这些控制字符拆分字符串并相应地对其进行解码即可。
下面是处理 latin1 和 shift-JIS 的函数的(非常慢)示例:
latin1 = "latin-1"
japanese = "Shift-JIS"
control_l = "\x0c"
control_j = "\n"
encodingMap = {
control_l: latin1,
control_j: japanese}
def funkyDecode(s, initialCodec=latin1):
output = u""
accum = ""
currentCodec = initialCodec
for ch in s:
if ch in encodingMap:
output += accum.decode(currentCodec)
currentCodec = encodingMap[ch]
accum = ""
else:
accum += ch
output += accum.decode(currentCodec)
return output
Run Code Online (Sandbox Code Playgroud)
更快的版本可能使用 str.split 或正则表达式。
(此外,正如您在本例中看到的,“^J”是“换行符”的控制字符,因此您的输入数据将有一些有趣的限制。)
| 归档时间: |
|
| 查看次数: |
2550 次 |
| 最近记录: |