用JSON.DUMPS作为UTF-8保存UTF-8文本,而不是\ U逃脱序列
)
import json
json_string = json.dumps("ברי צקלה")
print(json_string)
在A repl
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
示例代码( 。我的(智能)用户想使用JSON转储验证甚至编辑文本文件(我宁愿不使用XML)。
有没有办法将对象序列化为UTF-8 JSON字符串(而不是 \ uxxxx
)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
使用
huse_ascii = false
切换到json.dumps()
,然后手动将值编码为utf-8:如果您写入文件,只需使用
> json.dump()
,然后将其放在文件对象中以进行编码:python 2的python 2
python 2的警告,还有更多的警告需要考虑。如果将其写入文件,则可以使用
io。 open()
而不是open()
来生成一个文件对象,该文件对您编写Unicode值,然后使用json.dump()代替写入该文件:
请注意,有一个
json
模块中的错误huse_ascii = false
flag可以产生unicode
和str
对象的 mix 。然后,Python 2的解决方法是:在Python 2中,使用字节字符串(类型
str
),编码为UTF-8时,请确保还设置编码>编码
键字:Use the
ensure_ascii=False
switch tojson.dumps()
, then encode the value to UTF-8 manually:If you are writing to a file, just use
json.dump()
and leave it to the file object to encode:Caveats for Python 2
For Python 2, there are some more caveats to take into account. If you are writing this to a file, you can use
io.open()
instead ofopen()
to produce a file object that encodes Unicode values for you as you write, then usejson.dump()
instead to write to that file:Do note that there is a bug in the
json
module where theensure_ascii=False
flag can produce a mix ofunicode
andstr
objects. The workaround for Python 2 then is:In Python 2, when using byte strings (type
str
), encoded to UTF-8, make sure to also set theencoding
keyword:写入文件
以打印到stdout
To write to a file
To print to stdout
感谢您在这里的原始答案。使用Python  3以下代码行:
还可以。如果不是必须在代码中写太多文本,请考虑不要在代码中写太多文本。
对于Python控制台来说,这可能足够好。但是,要满足服务器,您可能需要设置此处所述(如果它在Apache上)
基本上,安装he_il或ubuntu上的任何语言语言环境。
检查它未安装:
安装它,其中xx是您的语言:
例如:
将以下文本添加到/etc/apache2/envvrs
中,您希望您不会从Apache上遇到Python错误:
Apache中的范围内(128),尝试使UTF默认编码如下所述:
在utf-8对于Apache
做到这一点,因为Apache错误可能会引起调试很痛苦,并且您会错误地认为这是来自Python的,这在这种情况下可能并非如此。
Thanks for the original answer here. With Python 3 the following line of code:
was ok. Consider trying not writing too much text in the code if it's not imperative.
This might be good enough for the Python console. However, to satisfy a server, you might need to set the locale as explained here (if it is on Apache 2)
Setting LANG and LC_ALL when using mod_wsgi
Basically, install he_IL or whatever language locale on Ubuntu.
Check it is not installed:
Install it, where XX is your language:
For example:
Add the following text to /etc/apache2/envvrs
Then you would hopefully not get Python errors on from Apache like:
Also in Apache, try to make UTF the default encoding as explained here:
How to change the default encoding to UTF-8 for Apache
Do it early because Apache errors can be pain to debug and you can mistakenly think it's from Python which possibly isn't the case in that situation.
从Python 3.7开始,以下代码正常工作:
输出:
As of Python 3.7 the following code works fine:
Output:
这是错误的答案,但是了解为什么错误仍然很有用。请参阅评论。
使用
Unicode-Escape
:This is the wrong answer, but it's still useful to understand why it's wrong. See comments.
Use
unicode-escape
:Pieters的Python 2解决方法在边缘案例上失败:
它在第3行的.decode('utf8')的一部分上崩溃。我通过避免使用该步骤来使程序更简单地解决了该问题,从而解决了问题作为ASCII的特殊套管:
Pieters' Python 2 workaround fails on an edge case:
It was crashing on the .decode('utf8') part of line 3. I fixed the problem by making the program much simpler by avoiding that step as well as the special casing of ASCII:
使用 unicode-escape 来解决问题
说明
原始资源: python3使用unicode-escape处理unicode 16
Use unicode-escape to solve the problem
Explanation
Original resource:Python3 使用 unicode-escape 处理 unicode 16进制字符串编解码问题
如果要从文件加载JSON字符串,而文件内容是阿拉伯语文本,则可以正常工作。
假设像 arabic.json 这样的文件
从 arabic.json.json 文件中获取阿拉伯内容,
以在Django模板中使用JSON数据,请按照以下步骤:
完成!现在,我们可以将结果作为具有阿拉伯值的JSON指数。
If you are loading a JSON string from a file and the file content is Arabic texts, then this will work.
Assume a file like arabic.json
Get the Arabic contents from the arabic.json file
To use JSON data in a Django template follow the below steps:
Done! Now we can get the results as a JSON index with Arabic values.
以下是我的理解量阅读答案和Google。
The following is my understanding var reading answer above and google.
这是使用json.dump()的我的解决方案:
将System_Encoding设置为:
Here's my solution using json.dump():
where SYSTEM_ENCODING is set to:
如果可能的话,请使用编解码器
Use codecs if possible,
(这不是完全答案,但无论如何它可能会有所帮助... )
我经常使用以下命令将“转换” json-with- \ uxxxx-chars到json-with-with-utf8:
jq
是处理JSON的绝妙工具。在这里,我们仅使用识别功能。(像往常一样
(this is not exactly an answer, but it may help anyway...)
I often use the following command to "convert" json-with-\uxxxx-chars to json-with-utf8:
jq
is a fantastic tool to process json. Here we are using just identify-function.(As usual,
apt install jq
, if not yet installed)在 json.dumps 中使用 suse_ascii = false 是解决此问题的正确方向,如 Martijn 指出。但是,这可能会导致一个例外:
您需要额外的设置。设置您的 sys.getDefaultEncoding()正确。 site.py 在 lib/python2.7/和 sitecustomize.py 下 lib/python2.7/site-packages 。
如果您想使用 site.py ,在def setEncoding()下:更改第一个If 0:为1:如果:python将使用您的操作系统的语言环境。
如果您喜欢使用 siteCustomize.py ,如果您没有创建它,则可能不存在,只需添加以下行:
然后您可以以UTF-8格式进行一些中文JSON输出,例如:
您将获得一个UTF-8编码的字符串,而不是\ u逃脱的JSON字符串。
要验证您的默认编码:
您应该获取“ UTF-8”或“ UTF-8”以验证您的 site.py.py 或 sitecustomize.py.py 设置。
请注意,您不能在交互式Python控制台上进行 sys.setsss.sendefeaultencoding(“ utf-8”)。
Using ensure_ascii=False in json.dumps is the right direction to solve this problem, as pointed out by Martijn. However, this may raise an exception:
You need extra settings in either site.py or sitecustomize.py to set your sys.getdefaultencoding() correct. site.py is under lib/python2.7/ and sitecustomize.py is under lib/python2.7/site-packages.
If you want to use site.py, under def setencoding(): change the first if 0: to if 1: so that Python will use your operation system's locale.
If you prefer to use sitecustomize.py, which may not exist if you haven't created it, simply add these lines:
Then you can do some Chinese JSON output in UTF-8 format, such as:
You will get an UTF-8 encoded string, rather than a \u escaped JSON string.
To verify your default encoding:
You should get "utf-8" or "UTF-8" to verify your site.py or sitecustomize.py settings.
Please note that you could not do sys.setdefaultencoding("utf-8") at an interactive Python console.