Linux中非英语字符变为"."字符
我正在为我的Django应用程序创建一个“语言文件”,目的是添加本地化支持。
问题是,当翻译的文本中有一些非英语字符时,它们会被替换成“.”这个字符,Django对此会报错。
比如:
English German
Change Password Passwort ändern
在这里,ä
被替换成了.
我不明白为什么我不能把这个文本粘贴到我的文本文件里。我可以在终端中粘贴,但在用vi
打开文件时却不行。
我在一个嵌入式设备上使用的是linux 2.6.32
。
在准备语言文件时,Django给出的错误信息是:
locale/de/LC_MESSAGES/django.po:472:70: invalid multibyte sequence
我完全不知道为什么会这样。有没有人能给我一些建议呢?
提前谢谢大家。
2 个回答
0
看起来你在编码上有些不匹配的问题。现在的Linux一般使用utf-8编码,但你可能在某个地方还设置了旧的iso-8859-n编码,这会导致一些麻烦。而且,Django需要知道用什么编码来读取文件。
- Vim编辑器有几个与编码相关的选项:
encoding
(指定它内部使用的编码和其他两个的默认编码),fileencoding
(指定读取和写入特定文件时使用的编码,按缓冲区来设置),还有termencoding
(指定在终端上显示时使用的编码;在图形界面版本中不使用)。你可以通过在:edit
命令后加上++enc=
标志来指定打开文件时的fileencoding
。比如,你可以这样打开文件::e ++enc=utf-8 file.txt
。试试不同的组合,直到字符正确显示,并且Vim不再抱怨无法转换的情况。这样你就能知道自己在用什么编码了。 - 在Python中,默认情况下,只有ascii字符可以在字节字符串(
str
)和Unicode字符串(unicode
)之间转换。如果你想用不同的编码打开文件并解释字符串,就需要用codecs
包来显式指定编码。
如果在Django中打开了文件,你需要找到方法告诉它使用什么编码。
4
好的,我解决了我的问题。之前我遇到的“无效的多字节序列”错误,其实是因为我的 .po 文件编码不正确。
我通过执行以下命令确认了这一点:
file -i django.po
这个命令的输出显示文件的编码类型是 ISO-8859-1
。
于是,我使用以下命令把文件转换成了“UTF-8”编码:
iconv --from-code=ISO-8859-1 --to-code=UTF-8 django.po > django_utf8.po
然后,我用新生成的文件替换了旧的 django.po 文件,结果“makemessages”和“compilemessages”都顺利运行了。
感谢大家之前的回答。
希望这能帮助到将来的某个人!