【问题标题】:Django string disappears in template when applying unicode filter应用 unicode 过滤器时,Django 字符串在模板中消失
【发布时间】:2015-12-29 05:23:52
【问题描述】:

我有一个自己编写的工具,它将印度音译字符串转换为 unicode 输出,工作方式如下:

>>> x_HK_to_UNI("ahaM")

会产生以下字符串:

'aha\xe1\xb9\x82''

到目前为止,这个工具已经过测试并已用于转换数千份文档。 现在我正在编写一个 Django 应用程序并希望将此功能用作模板中的过滤器。代码如下所示:

from __future__ import unicode_literals
from django import template
from django.utils.encoding import smart_text
from xliterator import *
register = template.Library()

@register.filter
def process_trans_for_html(string):
    newstring = []
    string = string.split(' ')
    for word in string:
        if word[-3:] == '_xn' :
            newstring.append(x_HK_to_UNI(word[:1]).upper()+(x_HK_to_UNI(word[1:-3]).lower())
        elif word[-3:] == '_xh' :
            newstring.append(x_HK_to_UNI(word[:-3]).lower())
        else:
            newstring.append(word)
    return ' '.join(newstring)

在模板中,我以这种方式将数据传递给过滤器:

{{ line.line|process_trans_for_html }}

基本上,只要没有替换任何内容,该功能就可以工作,因此当它处理 yena_xn 时,它会在网站上正确显示为 Yena。 但是 ahaM_xn 应该变成 ahaṃ (这是x_HK_to_UNI的工作) - 当遇到这样的词时,整个字符串就会消失并留下空白页面。

对此有何建议?我已经尝试了各种 unicode 转换的东西,似乎没有太大帮助。我觉得比较糊涂。也没有错误信息。

我使用 Python2.7。

编辑:这里是 xliterator.py 的相关部分:

import sys, re, os

SEPARATOR_PRIMARY=";"

class Xlator(dict): # Xlator is initialized through a mapping
    def _make_regex(self):
        """Build re object based on the keys of the current dict"""
        return re.compile("|".join(map(re.escape, self.keys())))
    def __call__(self, match):
        """Handler invoked for each regex match"""
        return self[match.group(0)] 
    def xlate(self, text):
        """Translate text, returns the modified text"""
        return self._make_regex().sub(self, text)

def _transposeDict(d): # returns a dict with key value transposed
    nd = {}
    for (k,v) in d.items():
        nd[v]=k
    return nd

#Unicode to HK  
DICT_UNI_HK = {'ā':'A','Ā':'A','ī':'I','Ī':'I','ū':'U','Ū':'U',\
    'ṛ':'R','Ṛ':'R','ṝ':'RR','ḷ':'L','Ḷ':'L','ḹ':'LL',\
    'ṃ':'M','Ṃ':'M','ḥ':'H','Ḥ':'H','ṅ':'G','Ṅ':'G',\
    'ñ':'J','Ñ':'J','ṭ':'T','Ṭ':'T','ḍ':'D','Ḍ':'D',\
    'ṇ':'N','Ṇ':'N','ś':'z','Ś':'z','ṣ':'S','Ṣ':'S',
    } 

def x_UNI_to_HK(in_str_UNI): # input: 
    xlator_Obj = Xlator(DICT_UNI_HK)
    return xlator_Obj.xlate(in_str_UNI) 

def x_HK_to_UNI(in_str_UNI):
    DICT_HK_UNI = dict (zip(DICT_UNI_HK.values(),DICT_UNI_HK.keys()))
    xlator_Obj = Xlator(DICT_HK_UNI)
    return xlator_Obj.xlate(in_str_UNI)

【问题讨论】:

  • 你在process_trans_for_html方法中调试过吗?如果不是怎么办。如果您还没有设置 django 调试,那么如何散布一些日志消息以查看其中发生了什么。由于您的 x_HK_to_UNI 是用于 stackoverflow 阅读的黑盒,因此回答这个问题需要大量猜测。与 xliterator import * 无关的是你想要的东西
  • 我刚刚添加了 xliterator 的代码,抱歉我忘记了。 :)
  • 我可以解决它,在 xliterator.py 的头文件中的一个简单的 reload(sys) sys.setdefaultencoding('utf8') 就可以了。但是现在整个过程非常缓慢,加载页面需要数年时间......但基本上它正在工作。 :)

标签: python django templates unicode


【解决方案1】:

自己解决了, xliterator.py 中缺少以下内容 重新加载(系统)
sys.setdefaultencoding('utf8')

我猜是非常基本的问题。 :) 现在这个过程慢得要命,加载页面需要很长时间,但基本上它正在做它应该做的事情。

【讨论】:

  • 您可以接受自己的答案。抱歉帮不上忙。至于速度,你可以通过改变你的 make_regex() 方法来加快速度,而不是每次都编译正则表达式。而且您每次都在转置您的字典。为什么不生成一次转置并保存呢?
  • 这意味着您的代码中某处有一个隐式的 str->Unicode 转换。 sys.setdefaultencoding('utf8') 是解决不良代码的讨厌黑客
【解决方案2】:

尽管您的主代码具有from __future__ import unicode_literals,但您的 xliterator.py 脚本将使用 Python 2.x 语法进行解释。

您发现将默认编码设置为 UTF-8 可以解决您的问题,这意味着 Python 很难与 xliterator.py 中编码的 UTF-8 进行比较和转换。 Django 可能会给你 Unicode 字符串,但你还没有告诉 Python 如何在(字节)字符串和 Unicode 字符串之间进行转换。

解决此问题的最简单方法是将from __future__ import unicode_literals 添加到 xliterator.py 中,以便所有字符串都变为 Unicode 字符串。

还将# coding: utf-8 添加到 xliterator.py 的顶部将确保您的 UTF-8 源代码正确解码为 Unicode 字符串。

【讨论】:

  • 感谢您的进一步解释,这对我来说很有意义。 :)
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多