有类似的问题,但解决方案似乎不起作用.
说我编码了一个字符串:
>>> a = 'dada??'.encode('utf-8')
>>> type(a)
<class 'bytes'>
>>> a
>>> b'dada\xe5\xa4\xa7\xe5\xa4\xa7'
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
dada\xe5\xa4\xa7\xe5\xa4\xa7
Run Code Online (Sandbox Code Playgroud)
str(a) 不起作用:
>>> str(a)
>>> "b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'"
Run Code Online (Sandbox Code Playgroud)
我已经尝试将stdout重定向到一个变量,但仍然,我得到了"b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'".
我可以使用正则表达式处理它并获得我想要的东西,但我正在寻找一种更加pythonic的方法来做到这一点.有什么建议?
你很高兴在评论中提到你的实际问题,我会再次更新我的答案以实际回应.原始答案可以在下面看到.
这是我发给Github Markdown API的字符串.这是可以接受unicode字符的唯一方法.我得到了带有orignal字符的渲染html
dada??
在GitHub的降价API需要用户将数据发送的JSON.JSON本身借用了从JavaScript转义的字符串,这将\u5927用于此角色.但是,在使用json模块时,您根本不需要担心:
from urllib import urlopen
import json
text = 'dada??'
data = json.dumps({ mode: 'markdown', 'text': text }).encode()
r = urlopen('https://api.github.com/markdown', data)
print(r.read().decode()) # <p>dada??</p>
Run Code Online (Sandbox Code Playgroud)
如您所见,API可以毫无问题地接受编码文本并正确生成正确的输出,而无需担心编码.
或者在requests库中使用原始API时:
h = { 'Content-Type': 'text/plain' }
r = requests.post('https://api.github.com/markdown/raw', text.encode(), headers=h)
print(r.content.decode()) # <p>dada??</p>
Run Code Online (Sandbox Code Playgroud)
>>> a = 'dada??'.encode('utf-8')
>>> a
b'dada\xe5\xa4\xa7\xe5\xa4\xa7'
>>> str(a)
"b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'"
>>> str(a)[2:-1]
'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'
>>> print(_)
dada\xe5\xa4\xa7\xe5\xa4\xa7
Run Code Online (Sandbox Code Playgroud)
当你这样做时,str(a)你将获得字节字符串的字符串表示.当然,当你在解释器中使用它时,解释器实际上会调用repr它来显示它.并且包含反斜杠的字符串会将它们转义为\\.这就是那些人来自的地方.
最后,你必须剥离b'和尾随'以获得字节字符串的字符串表示的内容.
旁注:str()和repr()上个字节的对象时会产生相同的结果.
根据Poke的回答,我需要的是阻止自动转换
repr.
不,你没有.最终字符串中没有双反斜杠.它们只出现,因为当您在REPL中输入内容时,它会在调用它们之后将事物的返回值输出到控制台repr.但这并不意味着,实际的字符串突然改变了:
>>> s = str(a)[2:-1]
>>> len(s)
28
>>> list(s)
['d', 'a', 'd', 'a', '\\', 'x', 'e', '5', '\\', 'x', 'a', '4', '\\', 'x', 'a', '7', '\\', 'x', 'e', '5', '\\', 'x', 'a', '4', '\\', 'x', 'a', '7']
Run Code Online (Sandbox Code Playgroud)
如您所见,字符串中没有双反斜杠.是的,你可以再次看到它们,但这又是因为list(s)REPL打印的返回值.列表中的每个项目都是单个字符,包括反斜杠.它们只是再次转义,因为它'\'不是有效的字符串.
>>> '\'
SyntaxError: EOL while scanning string literal
>>> '\\'
'\\'
>>> len('\\')
1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |