Python将混合ASCII码转换为字符串
我正在使用python-memcached库从memcached中获取一个由其他应用程序设置的值。但是不幸的是,我得到的值是这样的:
>>> mc.get("key")
'\x04\x08"\nHello'
有没有办法用Python函数把这个混合的ASCII代码解析成普通字符串呢?
非常感谢你的帮助!
2 个回答
如果你只是想去掉字符串中的 '\x04\x08"\n'
这些特定的字符,而且这些字符总是一样的(你的问题没有说得很清楚,我不太确定你是不是这个意思),可以试试下面的做法:
to_trim = '\x04\x08"\n'
string = mc.get('key')
if string.startswith(to_trim):
string = string[len(to_trim):]
这是一种“普通字符串”,在这种东西存在的范围内。我不知道你期待什么样的输出,但:
其实没有所谓的普通文本。
在Python(至少在2.x版本中),str
类型实际上是字节的容器,而不是字符。所以它根本不算真正的文本 :) 它会根据一种非常简单的编码方式来显示字节,使用转义序列来表示每个稍微“奇怪”的字节。如果你用print
来输出这个字符串,它的格式又会有所不同(你现在看到的其实是创建这种字面字符串的代码语法)。
在简单的时代,我们天真地认为可以直接把字节映射到我们称之为“字符”的符号上,就这样了。结果发现,实际上有大约无数种不同的映射方式,人们想用的很多符号需要的数量超过了一个字节能表示的范围。这就是为什么我们现在有Unicode:它代表了你可能需要的任何现实世界语言的每个符号(还有一些虚构语言和其他用途),并且它抽象地给这些符号分配了数字,但并没有说明如何将字节收集并解释为数字。(这就是编码的目的)。
如果你知道字符串数据是以特定方式编码的,你可以将其解码为Unicode字符串。它可能是实际Unicode数据的编码,或者可能是其他格式(例如,日文文本通常使用一种叫“Shift-JIS”的编码,因为对他们来说,它的意义大致相当于我们常用的“Latin-1”——ASCII的一种常见扩展)。无论哪种情况,你都会得到一系列Unicode代码点的内存表示(就是前面提到的那些数字)。从某种意义上说,这才是真正的“文本”,但它并不算“普通” :)
不过看起来你手上的数据实际上是一个二进制字节块,如果按ASCII解读的话,恰好大部分是“可读文本”。
你真正需要做的是弄清楚为什么第一个字节的值是4,第二个字节的值是8,然后再根据这个进行处理。