[英]JSON contains incorrect UTF-8 \u00ce\u00b2 instead of Unicode \u03b2, how to fix in Python?
首先请注意,符号β(希腊语beta)在UTF-8:CE B2中具有十六进制表示形式
我在Python 2.7中有使用json字符串的旧版源代码:
u'{"something":"text \\u00ce\\u00b2 text..."}'
然后,我调用json.loads(string)或json.loads(string,'utf-8'),但结果是带有UTF-8字符的Unicode字符串:
u'text \xce\xb2 text'
我想要的是普通的Python Unicode(UTF-16?)字符串:
u'text β text'
如果我打电话给:
text = text.decode('unicode_escape')
在json.loads之前,那么我得到了正确的Unicodeβ符号,但是它也通过替换所有新行来破坏json- \\n
问题是,如何仅转换"\\\Î\\\\00b2"
部分而不影响其他json特殊字符?
(我是Python的新手,它不是我的源代码,所以我不知道这应该如何工作。我怀疑代码仅适用于ASCII字符)
大概是这样的。 限于2个字节的UTF-8字符。
import re
j = u'{"something":"text \\u00ce\\u00b2 text..."}'
def decodeu (match):
u = '%c%c' % (int(match.group(1), 16), int(match.group(2), 16))
return repr(u.decode('utf-8'))[2:8]
j = re.sub(r'\\u00([cd][0-9a-f])\\u00([89ab][0-9a-f])',decodeu, j)
print(j)
为您的示例返回{"something":"text \β text..."}
。 此时,您可以将其导入为常规JSON并获取所需的最终字符串。
result = json.loads(j)
这是一个字符串修复程序,在加载JSON后可以使用。 它处理任何长度的类似UTF-8的序列,并忽略看起来不像UTF-8序列的转义序列。
例:
import json
import re
def fix(bad):
return re.sub(ur'[\xc2-\xf4][\x80-\xbf]+',lambda m: m.group(0).encode('latin1').decode('utf8'),bad)
# 2- and 3-byte UTF-8-like sequences and onen correct escape code.
json_text = '''\
{
"something":"text \\u00ce\\u00b2 text \\u00e4\\u00bd\\u00a0\\u597d..."
}
'''
data = json.loads(json_text)
bad_str = data[u'something']
good_str = fix(bad_str)
print bad_str
print good_str
输出:
text β text ä½ 好...
text β text 你好...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.