Kivy编码日语(Unicode)
我正在尝试在我的应用程序中显示日文字符。从文档和其他资料中,我发现可以使用Label(text=u'我是中文', font_name='fonts/ARIALUNI.TTF')来实现(arialuni字体应该能处理日文和中文字符)。但是我想知道在.kv文件中如何用Kivy语言来指定这个?这是我尝试的:
main.py:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class Design1(BoxLayout):
pass
class KanjiLayoutApp(App):
def build(self):
return Design1()
if __name__ == '__main__':
KanjiLayoutApp().run()
kanjilayout.kv:
<Design1>:
orientation: "vertical"
Label:
font_name: 'data/fonts/ARIALUNI.TTF'
text: u'速 dsf'
但是这样做后我得到了“é€Y dsf”。而且text: '速 dsf'如果不加u也不行。
补充一下,把あい(平假名)加到text: text: '速 dsf あい'中会出现更多错误:UnicodeDecodeError: 'charmap' codec无法解码位置369的字节0x81:字符映射到<未定义>。
4 个回答
我之前也遇到过关于波罗的海字母的问题,最后找到了解决办法:
你可以使用 u'\u0100',这个例子会生成拉脱维亚字母 "Ā"。所以你需要找到你所有字符的unicode编码。别问我为什么要用双重unicode声明,但对我来说,如果我用 u'Ā',在安卓上能用,但在Windows电脑上就不行;而用 '\u0100' 的话,Windows电脑上能正确显示,但安卓上就不行;不过如果用双重转义,就能在两个平台上都正常工作。
希望这对其他人也有帮助 :) 因为我花了几个小时才搞明白这件事 :)
PS. 对于日文,你可能需要使用 U'\U(8位十六进制数)'。
如果你想使用日文字符,可以下载这个 ttf 文件:
记得要指定你 .ttf
文件的完整路径:
<Design1>:
orientation: "vertical"
Label:
font_name:"/path/to/DroidSansJapanese.ttf"
text: '速'
我还没有测试,因为今天的一个更新搞坏了kivy的某些东西,但应该是可以用的。
对于想在 .kv 文件中使用其他语言的 Windows 用户,你需要手动加载一个 .kv 文件,并使用 utf-8
编码。需要注意的是,为了避免文件被自动加载并出现解码错误,这个 .kv 文件的名字必须和你的应用程序不同。这是因为 Windows 默认认为一个文件是 cp1252
编码,除非你特别说明。你还需要使用一种支持你想显示的字符的字体。我使用的是 Meiryo 字体来显示日文。所以举个例子:
main.py
#! /usr/bin/env python3
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
#These two lines are what opens the .kv file and uses the rules written within.
with open("Japanese.kv", encoding='utf-8') as f: # Note the name of the .kv
# doesn't match the name of the App
Builder.load_string(f.read())
class JapaneseTest(Widget):
pass
class JapaneseTestApp(App):
def build(self):
return JapaneseTest()
if __name__ == '__main__':
JapaneseTestApp().run()
Japanese.kv
#:kivy 1.10.0
<JapaneseTest>:
Label:
size: self.texture_size
font_size: 36
font_name: "meiryo.ttc"
text: "こんにちは!"
当然,要确保 .kv 文件是用你指定的编码写的。大多数不错的文本编辑器都允许你更改这个设置。
确保你的kv文件使用的是utf-8字符编码,这样就能正常工作了。大多数好的文本编辑器都允许你选择编码方式。
不要使用u''
,因为文件已经是unicode格式了(如果尝试使用u''
,会导致解码错误)。
我在使用arialuni字体时遇到了一些问题(它不显示汉字,但能显示假名,而且所有字符的上半部分都被切掉了,包括西方字母)。所以我换用了另一种字体(TakaoPMincho - 在Ubuntu上很容易安装)。
kanjitest.kv:
<TestWidget>:
Label:
text: '速 dsf あい'
font_name: 'TakaoPMincho.ttf'
font_size: sp(48)
结果: