Kivy编码日语(Unicode)

4 投票
4 回答
7006 浏览
提问于 2025-04-18 09:12

我正在尝试在我的应用程序中显示日文字符。从文档和其他资料中,我发现可以使用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 个回答

0

我之前也遇到过关于波罗的海字母的问题,最后找到了解决办法:

你可以使用 u'\u0100',这个例子会生成拉脱维亚字母 "Ā"。所以你需要找到你所有字符的unicode编码。别问我为什么要用双重unicode声明,但对我来说,如果我用 u'Ā',在安卓上能用,但在Windows电脑上就不行;而用 '\u0100' 的话,Windows电脑上能正确显示,但安卓上就不行;不过如果用双重转义,就能在两个平台上都正常工作。

希望这对其他人也有帮助 :) 因为我花了几个小时才搞明白这件事 :)

PS. 对于日文,你可能需要使用 U'\U(8位十六进制数)'。

0

如果你想使用日文字符,可以下载这个 ttf 文件:

记得要指定你 .ttf 文件的完整路径:

<Design1>:
    orientation: "vertical"
    Label:
        font_name:"/path/to/DroidSansJapanese.ttf"
        text: '速'
        

我还没有测试,因为今天的一个更新搞坏了kivy的某些东西,但应该是可以用的。

2

对于想在 .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 文件是用你指定的编码写的。大多数不错的文本编辑器都允许你更改这个设置。

3

确保你的kv文件使用的是utf-8字符编码,这样就能正常工作了。大多数好的文本编辑器都允许你选择编码方式。

不要使用u'',因为文件已经是unicode格式了(如果尝试使用u'',会导致解码错误)。

我在使用arialuni字体时遇到了一些问题(它不显示汉字,但能显示假名,而且所有字符的上半部分都被切掉了,包括西方字母)。所以我换用了另一种字体(TakaoPMincho - 在Ubuntu上很容易安装)。

kanjitest.kv:

<TestWidget>:
    Label:
        text: '速 dsf あい'
        font_name: 'TakaoPMincho.ttf'
        font_size: sp(48)

结果:

在这里输入图片描述

撰写回答