2014-06-09 35 views
1

我試圖在我的應用程序中獲取日文字符。從文檔和其他來源,我發現標籤(text = u'我是中文',font_name ='fonts/ARIALUNI.TTF')應該可以工作(arialuni字體應該能夠處理日文/中文字符)。不過,我想知道如何在.kv文件中的Kivy語言中指定它?這是我的嘗試:Kivy編碼日文(Unicode)

main.py:

​​3210

kanjilayout.kv:

<Design1>: 
    orientation: "vertical" 
    Label: 
     font_name: 'data/fonts/ARIALUNI.TTF' 
     text: u'速 dsf' 

但是這給了我 「速DSF」。還有 文本:沒有你的'速dsf'不起作用。

p.s.在文本中添加あい(假名):text:'速度dsfあい'給出了更多錯誤:UnicodeDecodeError:'charmap'編解碼器無法解碼位置369中的字節0x81:字符映射到< undefined>

+0

全部假名(平假名)錯誤: 回溯(最近通話最後一個): 文件。 「d:\ APPS \ KanjiLayout \ main.py」,第16行,在 KanjiLayoutApp()的run() 文件「 D:\ Apps \ _Kivy-1.8.0-py3.3-win32 \ kivy \ kivy \ app.py「,行765,運行 self.load_kv(filename = self.kv_file) 文件」D:\ Apps \ _Kivy-1.8.0-py3.3-win32 \ kivy \ kivy \ app.py「,第585行,在load_kv中 root = Builder.load_file(rfilename) 文件」D:\ Apps \ _Kivy-1.8.0- py3.3-win32 \ kivy \ kivy \ lang.py「,第1433行,在load_file中 data = fd.read() 文件」D:\ Apps \ _Kivy-1.8.0-py3.3-win32 \ Python33 \ LIB \編碼s \ cp1252.py「,行 23,解碼 – NumesSanguis

+0

也許試試'text:u'\ u9FXX dsf'或代碼點是什麼而不是文字字符 –

+0

return codecs.charmap_decode(input,self.errors,decode_table) [0] UnicodeDecodeError:'charmap'編解碼器無法解碼位置369中的字節0x81:字符映射到< undefined> – NumesSanguis

回答

2

確保你的kv文件使用的是utf-8字符編碼,它應該可以正常工作。大多數體面的文本編輯器將允許您選擇編碼。

請勿使用u'',因爲該文件已經是unicode(嘗試使用u''將導致解碼錯誤)。

我對arialuni字體有問題(沒有顯示漢字,但確實顯示假名,上半部分被所有字符切斷,包括西方字母)。所以我使用了不同的字體(TakaoPMincho - 易於在Ubuntu中安裝)。

kanjitest.kv:

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

結果:

enter image description here

+0

謝謝!所以問題在於文件如何保存。 我使用Builder.load_string處理.py文件,但是轉換.kv仍然會出現問題: >> 1:#:\ u20ac \ u20ackivy 1.8.0 2:#:import utils kivy 3:#:import os os ... 聲明後的數據無效。 我嘗試在睡眠後找出這個問題:p – NumesSanguis

+0

好的,我做了一些更多的測試。如果我在.py文件和.kv文件中輸入txt =「速dsfあい」:text = root.txt,我也可以使用它。然而,改變.kv文件的編碼會破壞它......你是如何在.kv文件中完成的? – NumesSanguis

+0

嘗試使用[Notepad ++](http://notepad-plus-plus.org/);它會顯示文件的當前編碼並允許您更改它(再加上它是Windows中最好的文本編輯器之一)。只要該文件使用UTF-8,它應該可以正常工作。如果沒有,那麼這是一個Windows相關的錯誤,應該[向Kivy報告](https://github.com/kivy/kivy/issues)(因爲它在Linux上運行)。 –

0

如果您想要使用的是日文字符,下載這個fft

指定您.fft文件的完整路徑:

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

我還沒有作爲一個更新測試今天已經搞砸了在kivy的東西,但它應該工作。

0

我有同樣的問題與波羅的海字母和設法找到解決辦法:

使用U '\ U0100' - 例如這將創建拉脫維亞字母「Â」,所以你必須找到所有字符的Unicode碼。不要問我爲什麼需要雙unicode聲明,但是對於我來說,如果我使用u''它可以在Android上運行,但是在win pc上製造垃圾,但是在'\ u0100'的情況下,我會在win pc上獲得正確的字母但在Android上廢話;當雙重逃脫時它對兩者都有效。 希望這可以幫助別人:)因爲我浪費了幾個小時才弄清楚:) PS。對於日語,您可能需要使用U'\ U(8char十六進制)'

0

對於希望在.kv文件中使用其他語言的Windows用戶,必須使用utf-8編碼手動加載.kv文件。請注意,爲避免它被自動加載並拋出解碼異常,無論如何.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.k​​v

#:kivy 1.10.0 

<JapaneseTest>: 
    Label: 
     size: self.texture_size 
     font_size: 36 
     font_name: "meiryo.ttc" 
     text: "こんにちは!" 

當然確保該.kv文件是寫在您指定的編碼。大多數體面的文本編輯應該允許你改變這一點。