当使用unicode过滤器时,Django字符串在模板中消失



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

>>> x_HK_to_UNI("ahaM")

结果为以下字符串:

'ahaxe1xb9x82''
到目前为止,这个工具已经经过测试,并已用于转换数千个文档。现在我正在编写一个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应该转换成 ahaha (这是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)

尽管您的主代码具有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字符串。

自己解决了,xliterator.py中缺少以下内容重载(sys)
sys.setdefaultencoding (use utf8)

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

最新更新