Python 应用unicode筛选器时,Django字符串在模板中消失

Python 应用unicode筛选器时,Django字符串在模板中消失,python,django,templates,unicode,Python,Django,Templates,Unicode,我有一个自己编写的工具,用于将印度音译字符串转换为unicode输出,工作方式如下: >>> x_HK_to_UNI("ahaM") from __future__ import unicode_literals from django import template from django.utils.encoding import smart_text from xliterator import * register = template.Library() @reg

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

>>> x_HK_to_UNI("ahaM")
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)
Wich将生成以下字符串:

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

>>> x_HK_to_UNI("ahaM")
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。 但是阿哈姆辛应该变成阿哈姆辛ṃ (这是
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)
我自己解决的,, xliterator.py中缺少以下内容 重新加载(系统)
sys.setdefaultencoding('utf8')


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

尽管主代码具有来自uuu future\uuuuu导入unicode\u文本的
,但xliterator.py脚本将使用Python 2.x语法进行解释

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

解决此问题的最简单方法是将
从uuu future\uuuu导入unicode\u文本
添加到xliterator.py,以便所有字符串都成为unicode字符串


另外,在xliterator.py的顶部添加
#coding:utf-8
,这将确保您的utf-8源代码被正确解码为Unicode字符串。

您是否在转换html方法的过程中进行了调试?如果不是,那怎么办。如果您还没有设置django调试,那么洒一些日志消息看看里面发生了什么。由于你的x_HK_to_UNI是阅读的黑盒,回答这个问题需要很多猜测。与xliterator import*无关的是您想要的东西。我刚刚添加了xliterator的代码,很抱歉,我忘了这么做。:)我可以解决这个问题,只需在xliterator.py的头中重新加载(sys)sys.setdefaultencoding('utf8')即可。但现在整个过程非常缓慢,加载页面需要几年时间。。。但基本上它是有效的你可以接受自己的答案。对不起,我帮不上忙。至于速度,您可以通过更改make_regex()方法,使其不每次编译正则表达式,从而可能会加快速度。你每次都在变换你的字典。为什么不生成一次转置并保存它呢?这意味着您的代码中有一个隐式的str->Unicode转换
sys.setdefaultencoding('utf8')
是一个讨厌的破解坏代码的方法谢谢你的进一步解释,这对我来说很有意义。:)