我在转义字符方面遇到了一些问题。
问题我:
我有一个字符串形式:
String = "%C3%85"
String
是UTF-8中两个字节的表示,用于编码此字符:“Å”。
除外:“\ x”替换为“%”。
所以我想改变 String 看起来像这样:
String = "\xC3\x85"
问题II:
表格中有一个字符串:
*String* = "\\x33"
现在我想将其转换为UTF-8字节表示形式,如下所示:
String = b"\x33"
我该怎么做?
我试过的方法:
我尝试使用替换方法:
string.replace("%","\") -- wont work since \ escapes "
string.replace("%","\\") -- wont work since this produces problem II
string.replace("%","\x00").replace("00","") -- wont work since "\x00" is a char by its own.
bytes(string.replace("%","\\") ) -- wont work since this basically comes down to problem II
一种有效的方法,但似乎需要更多的工作是创建一个包含以下形式的所有字符的字典:
"%00" = "\x00"
...
...
但是......这应该是自动化的,因为它基本上只是用x \
替换%我运气不好,无法在互联网上找到任何帮助。
lmgtfy也不会帮助我;)
感谢您的帮助!
答案 0 :(得分:1)
这两个问题都可以通过标准库解决。
问题我看起来像URL-Encoding,即。您在浏览器的地址栏中查询字符串中看到的那种“乱码”。
在Python 3中,urllib
模块可以处理:
>>> import urllib.parse
>>> urllib.parse.unquote('%C3%85')
'Å'
对于问题II,您似乎具有转义序列,因为它们在Python的字符串文字中使用。
您可能知道,您可以在源代码中键入'å'
或'\xe5'
以获得完全相同的字符串,就像您可以键入0.1
,.1
或{{1获取相同的浮点值。
由于Python解释器在源代码中看到了四个字符1e-1
,\
,x
和e
,因此必须有一种方法将此序列转换为字符{{ 1}}。并且(部分)此算法通过“unicode_escape”编解码器提供给Python程序员,您可以使用“正常”编解码器,如“utf-8”:
5
由于Python 3的å
类型没有>>> '\\x33'.encode('ascii').decode('unicode_escape')
'3'
方法,因此必须先将其编码为字节。
如果您的输入仅包含ASCII字符,则上述行有效;对于拉丁语-1字符和str
转义的混合,也可以使用“latin-1”。
答案 1 :(得分:0)
问题是你有十六进制编码字符字节数组的字符串表示。您需要将其从字符串转换为十六进制,然后让Python将其解释为UTF-8字符编码。试试这个:
import re
String = "%C3%85"
out = bytearray(int(c, 16) for c in re.findall(r'%(\w\w)', String)).decode('utf8')
out
# returns:
'Å'
对于第二部分,'\x33'
的二进制表示为b'3'
。要从字符串'\\x33'
获取到b'3'
,您需要删除字符串格式,将字符串字符转换为十六进制,然后转换为字节。
String = '\\x33'
out = bytes(int(c, 16) for c in re.findall(r'\\x(\w\w)', String))
out
# returns:
b'3'