【问题标题】:Encoding issue on a Django project on Linux connected to an SQL Server DBLinux 上连接到 SQL Server 数据库的 Django 项目的编码问题
【发布时间】:2011-07-06 13:27:35
【问题描述】:

我有一个 Django (1.2.x) 项目,旨在支持德语和英语语言。该项目使用mod_wsgi 托管在 Apache (2.x) 后面的 Linux 机器上。该数据库托管在一个单独的机器上运行在 Windows 上的 SQL Server 2005 上。 easysoft SQL Server ODBC driver 用于将项目与数据库连接起来。

我将使用项目中的一个应用程序中的模型之一作为这个问题的示例。这个有问题的模型包含一个 TextField。此字段在 SQL Server 的表中被转换为 NVARCHAR(MAX) 列类型。数据库的编码设置为“Latin1_General_CI_AS”。 easysoft unixODBC 源配置为使用ConvToUtf = 1,它在将数据从数据库返回到应用程序时,基本上将数据从 UCS-2 编码转换为 UTF-8 编码。 (这里之所以提到UCS-2,是因为我读过,发现SQL server 以UCS-2 编码存储Unicode 数据。)

但是,当通过管理面板查看存储在数据库中的数据时,德语字符会转换为奇怪的符号(这在查看管理面板上的数据时以及在返回数据的 API 中都可见JSON 格式)。

例如以下德语单词:Geschäftsbedingungen。在它被保存到数据库后,它会显示为:Geschäftsbedingungen。

在 Linux 机器上运行的 Python 版本是 Python 2.6。我不确定我应该提供哪些其他信息才能为问题提供更多背景信息。

显然,我已经尝试了几件事,但无济于事。我正在寻找有关如何解决此问题的任何线索。对此的任何帮助将不胜感激。

UPDATE:如果我发现的数据直接保存到数据库中 通过编辑表格 SQL管理软件,数据 在 Django 管理员上都显示正常 页面以及 API。这是 令人费解。数据保存时 通过管理面板,奇怪的 字符出现。

【问题讨论】:

  • stackoverflow.com/questions/947077/… 在我看来 pyodbc + FreeTDS 是更好的解决方案,免费且经常被 Django/Python 开发人员使用。你必须只记得在 freetds.conf 中设置 client charset = UTF-8
  • 我忘了提到我在 Django 中使用pyodbc。我不同意您对 FreeTDS 是更好的解决方案的看法。 FreeTDS 受到严格限制。由于FreeTDS面临的诸多限制和问题,我们不得不从easysoft购买商业驱动。

标签: sql-server django unicode encoding utf-8


【解决方案1】:

“ä”的 Unicode(和 UTF8)字节序列是 \xc3\xa4,在 Latin1 的单字节世界中是“ä”。

这意味着某处某处认为它正在获取 Latin1 编码,但事实并非如此。

一种解释是您的浏览器认为它正在显示 Latin1。我会检查您从 Web 服务器获取的 Content-Type 标头,并查看它是否指定了字符集。也许您在 Django 中的 DEFAULT_CHARSET 设置不正确。

【讨论】:

  • 非常感谢您的回复,seb。我可以确认我得到了Content-Type 的以下值:text/html; charset=utf-8。我没有为项目明确定义DEFAULT_CHARSET 设置(并假设Django 使用默认的UTF-8)。
  • 如果您查看页面的源代码,您会看到错误的内容,您看到的是 HTML 实体还是实际字符?
  • @seb:我看到页面源代码中的实际字符。例如,在管理员中,当我查看具有此类值的对象时,会显示一个文本区域:<textarea id="id_text" rows="10" cols="40" name="text" class="vLargeTextField">Geschäftsbedingungen</textarea>
  • 在这种情况下,这似乎确实是 UTF-8,因此在某处发生了这样的转换:双字节 "ä" -> 两个单字节字符 "ä" -> 两个双字节字符“ä”事实上,您可以通过重新编辑数据来“修复”这个问题,尽管 SQL 管理员暗示您的数据库可能根本没有存储 Unicode;例如它从 Django 获取双字节,将它们存储为单字节,然后将这些单字节转换为 ODBC 中的两个双字节。我对 SQL Server 一无所知,所以我能提供的帮助在这里枯竭。
  • 谢谢。那很有意思。我还注意到DATABASE_OPTIONS 下的collation 设置为Latin1_General_CI_AS。这会导致任何问题吗?不过,MSSQL 服务器上的数据库设置为 Latin1_General_CI_AS。
猜你喜欢
  • 2014-01-24
  • 2020-12-31
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多