2016-04-09 14 views
2

belli kana için geçerli ayırıcı işaretler birleştirerek orada, bu nedenle diyelim arasındaki mantıksal bir ilişki olduğunu "か" (ka) ve "が" (ga) - ga karakterdir dile getirdi.Japon kana karakterleri arasında farklı aksan işaretleri olan "mantıksal" dönüşümler yapmanın bir yolu var mı? Japonca'da

Herhangi bir doğal yol olup olmadığını merak ediyorum (Python'da, tercihen, unicode hakkında genel bir cevap olsa da), dile getirilen karakterleri, kendilerine ait olmayan eşdeğerlerine dönüştürmenin eşdeğerini yapmak ve tersi - latin komut dosyalarında geçerli olan lower() yöntemine benzer. Aradığım şeyin bir örneği yapmak:

anda
>>> devoice('が') 
"か" 
>>> voice('か') 
"が" 
>>> devoice('か') 
"か" 
>>> semivoice('は') 
"ぱ" 
>>> devoice('ぱ') 
"は" 

, en iyi yaklaşım ben satır, sütun ve dile getiren tarafından dizine bir arama tablosu oluşturmaktır ile gelip muktedir görünüyor, o zaman bak sahip olduğum karakteri yukarı ve doğru yönde çevir. Bunu yapmak için daha doğal bir yol olup olmadığını bilmek istiyorum.

>>> a = chr(0x304B) + chr(0x3099) 
>>> b = chr(0x304C) 
>>> print(a) 
'が' 
>>> print(b) 
'が' 
>>> a == b 
False 

Ben değil do olanlarla esas endişe duyuyorum:

potansiyel bir tuzak o karakterleri birleştirerek unicode onların tek codepoint eşdeğerine eşit karşılaştırmak görünmüyor geliyor bana olmasıdır Birleştirme işaretlerini algılamak ve yok etmek için yeterince kolay olduğu için aksanları birleştirmeyi içerir.

Not: ben de doğru davranış (u) ve için ne olduğunu bilmek yeterli Japon fonolojisi anladığımdan emin değilim (vu - Nadir/eski) iyi olurdu neden yine, eğer orada Bunu yapmak için "doğal" bir yol vardı.

cevap

2

Sen de-ses böylece devoice() olarak uygulanabilir unicodedata.normalize() function

>>> import unicodedata 
>>> print(ascii(unicodedata.normalize('NFD', '\u304c'))) 
'\u304b\u3099' 

kullanılarak (nfd formlara NFC hareket) karakterini ayrıştırılarak: daima dile getiren olursa

def devoice(char): 
    return unicodedata.normalize('NFD', char)[0] 

(benzediğini) \u3099, yeni girdiğiniz kana o ekleyebilir ve NFC kombine normal formu dönebilirsiniz ekler:

def voice(char): 
    return unicodedata.normalize('NFC', char + '\u3099') 

Bu semivoiced benziyor sen \u309a' eklemek anlamı:

import unicodedata 

def voice(char): 
    if not ('\u3041' <= char <= '\u3096') or len(char) > 1 or unicodedata.decomposition(char): 
     return char 
    return unicodedata.normalize('NFC', char + '\u3099') 

def semivoice(char): 
    if not ('\u3041' <= char <= '\u3096') or len(char) > 1 or unicodedata.decomposition(char): 
     return char 
    return unicodedata.normalize('NFC', char + '\u309a') 

def devoice(char): 
    if not ('\u3041' <= char <= '\u3096') or len(char) > 1 or not unicodedata.decomposition(char): 
     return char 
    return unicodedata.normalize('NFD', char)[0] 
+0

Teşekkür:

def semivoice(char): return unicodedata.normalize('NFC', char + '\u309a') 

Muhtemelen bir ayrışma var olup olmadığını test etmek unicodedata.decomposition() kullanabilirsiniz! Diğer yöne ne dersin? Ben tercih edeceğini 'sesli ('\ u304b')' dönüş ' '\ u304c'' değil,'' \ u304b \ u3099''. – Paul

+0

@ Paul: –

+0

İyi görünüyor :-) Hala o kısmı üzerinde çalışıyordu! Teşekkürler. Bir cevabı kabul etmeden önce hala bir gecikme var. – Paul

İlgili konular