我有一个自编的工具,正在将印度音译字符串转换为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)
答案 0 :(得分:1)
尽管您的主代码有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字符串。
答案 1 :(得分:0)
我自己解决了,
xliterator.py中缺少以下内容
重装(SYS)
sys.setdefaultencoding函数( 'UTF8')
我猜是非常基本的问题。 :)现在这个过程很慢,加载页面需要很长时间,但基本上它正在做它应该做的事情。