在Python(3.5.0)中,我希望将包含unicode符号的字符串(更准确地说,是从Wiktionary检索的JSON格式的IPA符号)打印到屏幕或文件中,例如
print("\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n")
正确打印
^{pr2}$-但是,每当我在变量中使用字符串时,例如
ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
print(ipa)
它只是按原样打印出字符串
\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n
这帮不了什么忙。在
我已经尝试了几种方法来避免这种情况(比如通过deocde
/encode
),但没有一种方法起到作用。在
我不能和
u'\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'
或者因为我已经将字符串作为变量检索(作为正则表达式匹配的结果),并且在代码中没有输入实际的文本。在
可能是我在从JSON结果转换的过程中犯了一个错误;现在我已经使用str(f.read())
将字节流转换为字符串,通过regex提取IPA部分(并对双反斜杠进行替换)并将其存储在string变量中。在
编辑:
这是我目前掌握的代码:
def getIPAen(word):
url = "https://en.wiktionary.org/w/api.php?action=query&titles=" + word + "&prop=revisions&rvprop=content&format=json"
jsoncont = str((urllib.request.urlopen(url)).read())
jsonmatch = re.search("\{IPA\|/(.*?)/\|", jsoncont).group(1)
#print("jsomatch: " + jsonmatch)
ipa = jsonmatch.replace("\\\\", "\\")
#print("ipa: " + ipa)
print(ipa)
用json.loads
修改后:
def getIPAen(word):
url = "https://en.wiktionary.org/w/api.php?action=query&titles=" + word + "&prop=revisions&rvprop=content&format=json"
jsoncont = str((urllib.request.urlopen(url)).read())
jsonmatch = re.search("\{IPA\|/(.*?)/\|", jsoncont).group(1)
#print("jsonmatch: " + jsonmatch)
jsonstr = "\"" + jsonmatch + "\""
#print("jsonstr: " + jsonstr)
jsonloads = json.loads(jsonstr)
#print("jsonloads: " + jsonloads)
print(jsonloads)
对于两个版本,当调用它时
getIPAen("watermelon")
我得到的是:
\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n
有没有任何方法可以让字符串打印/写入时已经解码,即使作为变量传递?在
你没有这个值:
因为这个值打印得很好:
^{pr2}$您的至少有
\
和u
字符:这些
\\
序列都是一个反斜杠,但是转义了。因为这是JSON,所以字符串可能还被双引号括起来:因为该字符串有文字反斜杠,所以打印的正是:
请注意,值echomed如何显示一个可以复制并粘贴回Python中的字符串文本,因此
\
字符将再次转义。在该值是有效的JSON,还使用
\uhhhh
转义序列。将其解码为JSON:现在有了一个正确的Python值:
请注意,在python3中,几乎所有代码点都是直接打印的,即使
repl()
为您创建了一个文本。json.loads()
结果直接显示值中的所有文本,即使大多数文本是非ASCII的。在此值不包含文本反斜杠或
u
字符:另外,在调试这样的问题时,您确实希望使用^{} 和^{} 函数,这样就可以得到正确地再现字符串值的表示:
请注意,只有实际Unicode码位超出拉丁-1范围的字符串上的
ascii()
才会产生实际的\uhhhh
转义序列。(对于repl()
输出,如果终端或控制台无法处理特定字符,Python仍然可以返回到\uhhhh
转义)。在至于您的更新,只需将整个响应解析为JSON,并从中加载正确的数据。相反,您的代码将
bytes
响应体转换为repr()
(对字节的str()
调用不会对数据进行解码;相反,您可以通过这种方式对双escape转义)。将来自网络的字节解码为UTF-8,然后将该数据馈送给json.loads()
:注意,我还确保在URL查询字符串中引用
word
值。在IPA发现了上面的指纹:
相关问题 更多 >
编程相关推荐