Linux中非英语字符变为"."字符

1 投票
2 回答
1097 浏览
提问于 2025-04-16 17:02

我正在为我的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”都顺利运行了。

感谢大家之前的回答。

希望这能帮助到将来的某个人!

撰写回答