- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Django 来管理 Postgres 数据库。我在数据库中存储了一个代表西类牙(马拉加)城市的值。我的 Django 项目通过将 from __future__ import unicode_literals
放在我创建的每个文件的开头来为所有内容使用 unicode 字符串。
我需要从数据库中提取城市信息并使用 XML
请求将其发送到另一台服务器。沿途有日志记录,以便我可以观察数据流。当我尝试记录城市的值时,我得到以下回溯:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 1: ordinal not in range(128)
这是我用来记录我传递的值的代码。
def createXML(self, dict):
"""
.. method:: createXML()
Create a single-depth XML string based on a set of tuples
:param dict: Set of tuples (simple dictionary)
"""
xml_string = ''
for key in dict:
self.logfile.write('\nkey = {0}\n'.format(key))
if (isinstance(dict[key], basestring)):
self.logfile.write('basestring\n')
self.logfile.write('value = {0}\n\n'.format(dict[key].decode('utf-8')))
else:
self.logfile.write('value = {0}\n\n'.format(dict[key]))
xml_string += '<{0}>{1}</{0}>'.format(key, dict[key])
return xml_string
我基本上是将我拥有的所有信息保存在一个简单的字典中,并使用此函数生成一个 XML
格式的字符串——这超出了这个问题的范围。
我遇到的错误让我想知道数据库中实际保存了什么。我已经验证该值是 utf-8
编码的。我创建了一个简单的脚本来从数据库中提取值,对其进行解码并将其打印到屏幕上。
from __future__ import unicode_literals
import psycopg2
# Establish the database connection
try:
db = psycopg2.connect("dbname = 'dbname' \
user = 'user' \
host = 'IP Address' \
password = 'password'")
cur = db.cursor()
except:
print "Unable to connect to the database."
# Get database info if any is available
command = "SELECT state FROM table WHERE id = 'my_id'"
cur.execute(command)
results = cur.fetchall()
state = results[0][0]
print "my state is {0}".format(state.decode('utf-8'))
结果:我的州是马拉加
在 Django 中,我正在执行以下操作来创建 HTTP 请求:
## Create the header
http_header = "POST {0} HTTP/1.0\nHost: {1}\nContent-Type: text/xml\nAuthorization: Basic {2}\nContent-Length: {3}\n\n"
req = http_header.format(service, host, auth, len(self.xml_string)) + self.xml_string
任何人都可以帮助我解决问题,以便我可以将此信息写入数据库并能够创建 req
字符串以发送到其他服务器吗?
我是否因为 Django 的处理方式而收到此错误?如果是这样,Django 在做什么?或者,我告诉 Django 做什么导致了这种情况?
编辑1:我也尝试在此状态值上使用 Django 的 django.utils.encoding
。我从saltycrane读了一点关于 Djano 可能遇到的 unicode/utf-8 问题。
我试图修改我的日志记录以使用 smart_str
功能。
def createXML(self, dict):
"""
.. method:: createXML()
Create a single-depth XML string based on a set of tuples
:param dict: Set of tuples (simple dictionary)
"""
xml_string = ''
for key in dict:
if (isinstance(dict[key], basestring)):
if (key == 'v1:State'):
var_str = smart_str(dict[key])
for index in range(0, len(var_str)):
var = bin(ord(var_str[index]))
self.logfile.write(var)
self.logfile.write('\n')
self.logfile.write('{0}\n'.format(var_str))
xml_string += '<{0}>{1}</{0}>'.format(key, dict[key])
return xml_string
这样做我能够将正确的值写入日志,但我缩小了 Python 中 .format()
字符串功能的另一个可能问题的范围。当然,我在 Google 上搜索 python format unicode
得到的第一个结果是 Issue 7300。 ,它指出这是 Python 2.7 的一个已知“问题”。
现在,来自 another stackoverflow post我找到了一个在 Django 中无法使用 smart_str
功能的“解决方案”(或者至少我无法让它们一起工作)。
我将继续深入挖掘,看看是否找不到潜在的问题 - 或者至少找到解决方法。
编辑2:我通过简单地连接字符串而不是使用 .format()
功能找到了解决方法。我不喜欢这个“解决方案”——它很丑陋,但它完成了工作。
def createXML(self, dict):
"""
.. method:: createXML()
Create a single-depth XML string based on a set of tuples
:param dict: Set of tuples (simple dictionary)
"""
xml_string = ''
for key in dict:
xml_string += '<{0}>'.format(key)
if (isinstance(dict[key], basestring)):
xml_string += smart_str(dict[key])
else:
xml_string += str(dict[key])
xml_string += '<{0}>'.format(key)
return xml_string
我不打算回答这个问题,因为我很想找到一个解决方案,让我可以按照预期的方式使用 .format()
。
最佳答案
这是正确的方法(问题出在打开文件上。使用 UTF-8 您必须使用 codecs.open()
:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
class Writer(object):
logfile = codecs.open("test.log", "w", 'utf-8')
def createXML(self, dict):
xml_string = ''
for key, value in dict.iteritems():
self.logfile.write(u'\nkey = {0}\n'.format(key))
if (isinstance(value, basestring)):
self.logfile.write(u'basestring\n')
self.logfile.write(u'value = {0}\n\n'.format( value))
else:
self.logfile.write(u'value = {0}\n\n'.format( value ))
xml_string += u'<{0}>{1}</{0}>'.format(key, value )
return xml_string
这是来自 python 控制台:
In [1]: from test import Writer
In [2]: d = { 'a' : u'Zażółć gęślą jaźń', 'b' : u'Och ja Ci zażółcę' }
In [3]: w = Writer()
In [4]: w.createXML(d)
Out[4]: u'<a>Za\u017c\xf3\u0142\u0107 g\u0119\u015bl\u0105 ja\u017a\u0144</a><b>Och ja Ci za\u017c\xf3\u0142c\u0119</b>'
这是 test.log
文件:
key = a
basestring
value = Zażółć gęślą jaźń
key = b
basestring
value = Och ja Ci zażółcę
关于django - 在 Python 2.7 中使用 unicode_literals 时在 Django 中解码 utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288398/
我在 Python 中遇到了一个关于 __future__.unicode_literals 的奇怪问题。不导入 unicode_literals 我得到正确的输出: # encoding: utf-
在 Python 2 中,我想评估一个包含文字表示的字符串。我想安全地执行此操作,所以我不想使用 eval()——相反,我已经习惯了使用 ast.literal_eval()的任务。 但是,我还想在纯
我在 type() 调用中遇到支持 python2 和 python3 的问题。这说明了问题: from __future__ import unicode_literals name='FooCla
我已经在 Py2.7 中创建了一个包,我正在尝试使其与 Py3 兼容。问题是如果我在 __init__.py 导入构建返回这个错误 error in daysgrounded setup comman
使用 unicode_literals 时使用 pygame.Color 名称的正确方法是什么? Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:
我只是想知道为什么每个自动生成的 Django 迁移文件都包含以下行。 from __future__ import unicode_literals 即使我删除所有这些行,应用程序也运行正常。那么,
我们正准备迁移到 Python 3.4 并添加了 unicode_literals。我们的代码广泛依赖于使用 subprocess 模块的外部实用程序的管道。以下代码片段在 Python 2.7 上运
我正在创建一些必须在 2.6、2.7 和 3.3 下运行的演示 Python 脚本。 作为其中的一部分,每个模块都带有前缀 from __future__ import unicode_literal
使用 Nginx、uWSGI 和简单的 Flask 应用程序添加启用 unicode_literals 的 header 似乎会失败: # -*- coding: utf-8 -*- from __f
我正在尝试将我的 Python 2.7 程序转换为使用 from __future__ import unicode_literals 但是 pylint 对我大喊我不能将 unicode 字符串作为
我们已经让我们的代码库在 Python 2.6 下运行。为了准备 Python 3.0,我们开始添加: from __future__ import unicode_literals 到我们的 .py
我正在尝试 Django。我本来打算阅读它的文档。它不在那里,我必须 build 它。阅读Django-1.5/doc文件夹中的Readme,下载Sphinx文档Python模块。使用 easy_in
这个问题看起来与 this one 惊人地相似,但是评论中的建议不起作用(不再?),如下所示。 我正在尝试编写一个 python2-3 兼容包,我的一个方法中有一个类生成器,type() 在 pyth
我现在已经阅读了一些关于 unicode 的线程。 我使用的是 Python 2.7.2,但使用的是 future 的 print_function(因为原始打印语句让我很困惑......) 下面是一
我正在使用 Django 来管理 Postgres 数据库。我在数据库中存储了一个代表西类牙(马拉加)城市的值。我的 Django 项目通过将 from __future__ import unico
我所知道的是: # -*- 编码:utf-8 -*- 它用于声明 Python 源文件的编码,一旦我设置了编码名称,Python 解析器将使用给定的编码解释文件。我称之为“文件编码”; 从 __fut
考虑以下演示脚本: # -*- coding: utf-8 -*- from __future__ import division from __future__ import unicode_lit
我是一名优秀的程序员,十分优秀!