Python:打印存储为变量的unicode字符串

2024-10-05 13:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

有没有任何方法可以让字符串打印/写入时已经解码,即使作为变量传递?在


Tags: 字符串jsonurlwordipaprintu0259u025bl
1条回答
网友
1楼 · 发布于 2024-10-05 13:24:04

你没有这个值:

ipa = '\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'

因为这个值打印得很好:

^{pr2}$

您的至少有\u字符:

ipa = '\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n'

这些\\序列都是一个反斜杠,但是转义了。因为这是JSON,所以字符串可能还被双引号括起来:

ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'

因为该字符串有文字反斜杠,所以打印的正是:

>>> ipa = '"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(ipa)
"\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n"
>>> ipa[1]
'\\'
>>> print(ipa[1])
\
>>> ipa[2]
'u'

请注意,值echomed如何显示一个可以复制并粘贴回Python中的字符串文本,因此\字符将再次转义。在

该值是有效的JSON,还使用\uhhhh转义序列。将其解码为JSON:

import json

print(json.loads(ipa))

现在有了一个正确的Python值:

>>> import json
>>> json.loads(ipa)
'ˈwɔːtəˌmɛlən'
>>> print(json.loads(ipa))
ˈwɔːtəˌmɛlən

请注意,在python3中,几乎所有代码点都是直接打印的,即使repl()为您创建了一个文本。json.loads()结果直接显示值中的所有文本,即使大多数文本是非ASCII的。在

此值不包含文本反斜杠或u字符:

>>> result = json.loads(ipa)
>>> result[0]
'ˈ'
>>> result[1]
'w'

另外,在调试这样的问题时,您确实希望使用^{}^{}函数,这样就可以得到正确地再现字符串值的表示:

>>> print(repr(ipa))
'"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(ascii(ipa))
'"\\u02c8w\\u0254\\u02d0t\\u0259\\u02ccm\\u025bl\\u0259n"'
>>> print(repr(result))
'ˈwɔːtəˌmɛlən'
>>> print(ascii(result))
'\u02c8w\u0254\u02d0t\u0259\u02ccm\u025bl\u0259n'

请注意,只有实际Unicode码位超出拉丁-1范围的字符串上的ascii()才会产生实际的\uhhhh转义序列。(对于repl()输出,如果终端或控制台无法处理特定字符,Python仍然可以返回到\uhhhh转义)。在

至于您的更新,只需将整个响应解析为JSON,并从中加载正确的数据。相反,您的代码将bytes响应体转换为repr()(对字节的str()调用不会对数据进行解码;相反,您可以通过这种方式对escape转义)。将来自网络的字节解码为UTF-8,然后将该数据馈送给json.loads()

import json
import re
import urllib.request
from urllib.parse import quote_plus


baseurl = "https://en.wiktionary.org/w/api.php?action=query&titles={}&prop=revisions&rvprop=content&format=json"

def getIPAen(word):
    url = baseurl.format(quote_plus(word))
    jsondata = urllib.request.urlopen(url).read().decode('utf8')
    data = json.loads(jsondata)
    for page in data['query']['pages'].values():
        for revision in page['revisions']:
            if 'IPA' in revision['*']:
                ipa = re.search(r"{IPA\|/(.*?)/\|", revision['*']).group(1)
                print(ipa)

注意,我还确保在URL查询字符串中引用word值。在

IPA发现了上面的指纹:

>>> getIPAen('watermelon')
ˈwɔːtəˌmɛlən
>>> getIPAen('chocolate')
ˈtʃɒk(ə)lɪt

相关问题 更多 >

    热门问题