LoginSignup
6
0

色んなアジア文字のユニコードブロックを描いてみたり

Last updated at Posted at 2022-04-16

最近色んな国で使われている文字について興味を持っているので、たくさん勉強しています。

この世界には色んなタイプの文字が使われていますね。特にアジアの国ではバリエーションが多くて興味深いです。

そして現代のコンピューターはユニコードで色んな文字を表示することができて便利です。

ここではpythonを使って、各種類の文字を一気に羅列するpdfファイルを作成してみたいです。

基本

ここで主に使われるのはreportlabとpandasです。

reportlabの使い方はこれらの記事を参考に

文字のユニコードのブロックについてはこちら https://ja.wikipedia.org/wiki/ブロック_(Unicode)

ここで扱うのはアジアの国で使われるアルファベットアブギダ音素文字のみです。アラビア文字みたいなアブジャドや、漢字みたいな表語文字は割愛します。

文字の情報

まずはデータの集まりです。該当する72種類の文字の情報csvファイルに書いてあります。順番はユニコード範囲の順。

unitafon.csv
文字,ブロック名,範囲,数,フォント
アルメニア,Armenian,530,96,Noto Serif Armenian
ターナ,Thaana,780,64,Noto Sans Thaana
デーヴァナーガリー,Devanagari,900,128,Noto Serif Devanagari
ベンガル,Bengali,980,128,Noto Serif Bengali
グルムキー,Gurmukhi,A00,128,Noto Serif Gurmukhi
グジャラート,Gujarati,A80,128,Noto Serif Gujarati
オリヤー,Oriya,B00,128,Noto Sans Oriya
タミル,Tamil,B80,128,Noto Serif Tamil
テルグ,Telugu,C00,128,Noto Serif Telugu
カンナダ,Kannada,C80,128,Noto Serif Kannada
マラヤーラム,Malayalam,D00,128,Noto Serif Malayalam
シンハラ,Sinhala,D80,128,Noto Serif Sinhala
タイ,Thai,E00,128,Noto Serif Thai
ラオス,Lao,E80,128,Noto Serif Lao
チベット,Tibetan,F00,256,Noto Serif Tibetan
ビルマ,Myanmar,1000,160,Noto Serif Myanmar
グルジア,Georgian,10A0,96,Noto Serif Georgian
タガログ,Tagalog,1700,32,Noto Sans Tagalog
ハヌノオ,Hanunoo,1720,32,Noto Sans Hanunoo
ブヒッド,Buhid,1740,32,Noto Sans Buhid
タグバヌア,Tagbanwa,1760,32,Noto Sans Tagbanwa
クメール,Khmer,1780,128,Noto Serif Khmer
モンゴル,Mongolian,1800,176,Noto Sans Mongolian
リンブ,Limbu,1900,80,Noto Sans Limbu
タイ・ナ,Tai Le,1950,48,Noto Sans Tai Le
新タイロ,New Tai Lue,1980,96,Noto Sans New Tai Lue
ブギス,Buginese,1A00,32,Noto Sans Buginese
タイタム,Tai Tham,1A20,144,Noto Sans Tai Tham
バリ,Balinese,1B00,128,Noto Serif Balinese
スンダ,Sundanese,1B80,64,Noto Sans Sundanese
バタク,Batak,1BC0,64,Noto Sans Batak
レプチャ,Lepcha,1C00,80,Noto Sans Lepcha
オルチキ,Ol Chiki,1C50,48,Noto Sans Ol Chiki
シロティ・ナグリ,Syloti Nagri,A800,48,Noto Sans Syloti Nagri
パスパ,Phags-pa,A840,64,Noto Sans Phags Pa
サウラーシュトラ,Saurashtra,A880,96,Noto Sans Saurashtra
カヤー,Kayah Li,A900,48,Noto Sans Kayah Li
ルジャン,Rejang,A930,48,Noto Sans Rejang
ジャワ,Javanese,A980,96,Noto Sans Javanese
チャム,Cham,AA00,96,Noto Sans Cham
タイ・ヴィエト,Tai Viet,AA80,96,Noto Sans Tai Viet
メイテイ,Meetei Mayek,ABC0,64,Noto Sans Meetei Mayek
カローシュティー,Kharoshthi,10A00,96,Noto Sans Kharoshthi
突厥,Old Turkic,10C00,80,Noto Sans Old Turkic
ブラーフミー,Brahmi,11000,128,Noto Sans Brahmi
カイティー,Kaithi,11080,80,Noto Sans Kaithi
ソラングソンペング,Sora Sompeng,110D0,48,Noto Sans Sora Sompeng
チャクマ,Chakma,11100,80,Noto Sans Chakma
マハージャニー,Mahajani,11150,48,Noto Sans Mahajani
シャーラダー,Sharada,11180,96,Noto Sans Sharada
ホジャ,Khojki,11200,80,Noto Sans Khojki
ムルターニー,Multani,11280,48,Noto Sans Multani
フダーワーディー,Khudawadi,112B0,80,Noto Sans Khudawadi
グランタ,Grantha,11300,128,Noto Serif Grantha
ネワ,Newa,11400,128,Noto Sans Newa
ティルフータ,Tirhuta,11480,96,Noto Sans Tirhuta
悉曇,Siddham,11580,128,Noto Sans Siddham
モーディー,Modi,11600,96,Noto Sans Modi
タークリー,Takri,11680,80,Noto Sans Takri
アーホム,Ahom,11700,64,Noto Serif Ahom
ドーグリー,Dogra,11800,80,Noto Serif Dogra
ワラング・クシティ,Warang Citi,118A0,96,Noto Sans Warang Citi
ザナバザル方形,Zanabazar Square,11A00,80,Noto Sans Zanabazar Square
ソヨンボ,Soyombo,11A50,96,Noto Sans Soyombo
パウ・チン・ハウ,Pau Cin Hau,11AC0,64,Noto Sans Pau Cin Hau
バイクシュキー,Bhaiksuki,11C00,112,Noto Sans Bhaiksuki
マルチェン,Marchen,11C70,80,Noto Sans Marchen
マサラム・ゴーンディー,Masaram Gondi,11D00,96,Noto Sans Masaram Gondi
グンジャラ・ゴーンディー,Gunjala Gondi,11D60,80,Noto Sans Gunjala Gondi
ムロ,Mro,16A40,48,Noto Sans Mro
パハウ・フモン,Pahawh Hmong,16B00,144,Noto Sans Pahawh Hmong
ミャオ,Miao,16F00,160,Noto Sans Miao

このデータをファイルに保存して、後でpandasで読み込んで使います。

フォントの取得

文字を表示するためには、それぞれの文字に適応するフォントが必要です。幸いこれらのフォントが集まっているサイトがあります。
=> https://fonts.google.com/noto/fonts

今回はまずこのサイトから必要なフォントをスクレイピングします。

import requests,zipfile,os,io
import pandas as pd

df = pd.read_csv('unitafon.csv') # フォントのデータが書いてあるファイル
font_fd = 'fonta' # ファイルを保存する場所
for font_namae in df['フォント']: # フォントの名前で検索してダウンロードを行う
    url = 'https://fonts.google.com/download?family='+font_namae
    r = requests.get(url)
    # ダウンロードされたデータはzipなのでzipfileとioを使って、ロードした途端すぐ解凍する
    with zipfile.ZipFile(io.BytesIO(r.content)) as zf:
        for f in zf.infolist():
            if('.ttf' in f.filename):
                zf.extract(f,os.path.join(font_fd,font_namae))

これを実行したら全部必要なフォントを手に入れます。これで準備は整います。

pdfの作成

文字の情報と必要なフォントが整ったら、次はreportlabを使ってpdfファイルを作成します。

import os
from glob import glob
import pandas as pd
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import Table, TableStyle
from reportlab.lib import colors
from reportlab.platypus.flowables import Flowable

# 縦書きのフォントの処理をするためのクラス
class Tategaki(Flowable):
    def __init__(self,text):
        Flowable.__init__(self)
        self.text = text
    
    def draw(self):
        self.canv.rotate(-90)
        self.canv.drawString(0,0,self.text)
    
    def wrap(self,aW,aH):
        return self.canv._leading,-self.canv.stringWidth(self.text,self.canv._fontname,self.canv._fontsize)

df = pd.read_csv('unitafon.csv') # フォントのデータが書いてあるファイル
font_fd = 'fonta' # ファイルを保存する場所
save_folder = 'moji' # できたpdfファイルを保存するフォルダ

for i in range(len(df)):
    block = df['ブロック名'][i] # この文字のブロックの英語名
    font = df['フォント'][i] # この文字に使うフォントの名前
    h0 = int(df['範囲'][i],16) # ブロックのユニコードの開始(10進)
    h1 = h0+df[''][i] # ブロックのユニコードの終わり(10進)
    pdf_file = os.path.join(save_folder,'%05d.pdf'%h0)
    # 0~Fの16進数を一番上に書く
    data = [['']+list(hex(i)[-1].upper() for i in range(16))]
    n = 0 # 何列目
    for x in range(h0,h1+1):
        if(n==0): # 一番左のコマにユニコードを書く(16進)
            da = [hex(x)[2:-1].upper()+'x']
        if(len(str(list[chr(x)]))==9):
            # モンゴル文字とパスパ文字だけは縦書きにする
            if(block in ['Mongolian','Phags-pa']):
                da.append(Tategaki(chr(x)))
            else:
                da.append(chr(x))
        else:
            da.append('')
        n += 1 # 次の列
        if(n==16): # すでに16列になったら次の行に移動する
            data.append(da)
            n = 0
    
    pagesize = [35*17+20,35*len(data)+15] # ページの広さ×高さ
    pcanvas = canvas.Canvas(pdf_file,pagesize=pagesize) # pdfページを作成する
    pdfmetrics.registerFont(TTFont(font,glob(os.path.join(font_fd,font,'*.ttf'))[0])) # フォント登録
    pcanvas.setFont('Helvetica',16) # ローマ字部分のフォント
    pcanvas.drawCentredString(pagesize[0]/2,pagesize[1]-15,block) # ヘッドにブロックの名前を書く
    # 表を作成する
    table = Table(data,colWidths=[45]+[35]*16,rowHeights=[25]+[35]*(len(data)-1))
    ts = [ # 表の中のフォントや色や線などのプロパティ
        ('TEXTCOLOR',(0,0),(-1,-1),colors.Color(1,1,1,1)), # 白い字
        ('BACKGROUND',(0,0),(-1,-1),colors.Color(0.3,0.1,0.3,1)), # 暗い紫色の背景
        ('FONT',(0,0),(-1,-1),'Helvetica',14), # ローマ字部分のフォント
        ('TEXTCOLOR',(1,1),(-1,-1),colors.Color(0.5,0,0,1)), # 茶色の字
        ('BACKGROUND',(1,1),(-1,-1),colors.Color(0.99,0.95,0.99,1)), # 薄桃色の背景
        ('FONT',(1,1),(-1,-1),font,16), # 文字表示のフォント
        ('GRID',(0,0),(-1,-1),1,colors.black), # 黒いグリッド
        ('ALIGN',(0,0),(-1,-1),'CENTER'),
        ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
        ('RIGHTPADDING',(0,0),(-1,-1),0),
    ]
    # 字がないコマは灰色にする
    for y in range(1,len(data)):
        for x in range(1,len(data[y])):
            if(data[y][x]==''):
                ts.append(('BACKGROUND',(x,y),(x,y),colors.Color(0.3,0.3,0.3,1)))
    # ある特定のブロックの配置の問題の対処
    if(block in ['Gunjala Gondi']):
        ts.append(('ALIGN',(1,1),(-1,-1),'LEFT'))
    if(block in ['Marchen','Khojki','Newa','Zanabazar Square','Chakma']):
        ts.append(('ALIGN',(1,1),(-1,-1),'RIGHT'))
    if(block in ['Balinese','Javanese']):
        ts.append(('VALIGN',(1,1),(-1,-1),'TOP'))
    table.setStyle(TableStyle(ts)) # 表のプロパティを設定する
    table.wrapOn(pcanvas,5,5)
    table.drawOn(pcanvas,5,5) # 表を描く
    pcanvas.save() # pdfファイルに保存する

縦書きの文字の処理

ここで注意して欲しいところはモンゴル文字パスパ文字など常に縦書きしなければならない文字です。

現代使われている殆どの文字は横書きなので、多くのソフトでは縦書きの扱いに多少問題があってちょっと困ります。reportlabもそのようです。縦書きの文字をこのまま書いたら表示は間違いとなります。

ちょっと面倒ですが、解決方法について詳しくはここに書いてあるので助かります。
=> https://stackoverflow.com/questions/13061545/rotated-document-with-reportlab-vertical-text

結果

以上のコードを実行したら文字表の書いてあるpdfファイルが作成されるはずです。

しかしpdfファイルをそのままqiitaに載せることはできないので、ここではpdf2imageというモジュールを使ってpngファイルに変換してここに乗ります。

pdf2imageの使い方についてはこの記事
=> https://qiita.com/kikuyan8540/items/35751c573de014df205b
=> https://qiita.com/Gyutan/items/5e62420cc8f6bb106bed
=> https://qiita.com/masuda401/items/f5cf9102cd3380db6ffb

from pdf2image import convert_from_path
import pandas as pd
import os

df = pd.read_csv('unitafon.csv')
save_folder = 'moji'

for i in range(len(df)):
    h0 = int(df['範囲'][i],16)
    pdf_file = os.path.join(save_folder,'%05d.pdf'%h0)
    convert_from_path(pdf_file,72)[0].save(pdf_file.replace('.pdf','.png'),'PNG')

結果の画像は以下。

アルメニア文字

アルメニア文字は南コーカサス地方のアルメニアという小さな国で使われているアルメニア語を書く文字です。

ラテン文字と同じように横書きのアルファベットです。

01328.png

ターナ文字

ターナ文字モルディブという南アジアの島国の公用語であるディベヒ語を書くのに使われる文字です。

アラビア文字みたいに右から左へ書く文字ですが、アブジャドではなく、南アジアの多くの国に使われる文字と同じように、アブギダ文字です。

01920.png

デーヴァナーガリー文字

デーヴァナーガリー文字はインドを中心とする南アジアの国で話されているヒンディー語サンスクリットネパール語マラーティー語などで広く使われている文字です。

02304.png

ベンガル文字

ベンガル文字は南アジアのバングラデシュの公用語であるベンガル語を書くのに使う文字です。デーヴァナーガリーとよく似ています。その他にも、インド北東部のアッサム州で話されるアッサム語などにも使われます。(アッサム文字とも呼ばれるが、ユニコードはベンガル文字と一緒)

02432.png

グルムキー文字

グルムキー文字はインドのパンジャーブ州で話されるパンジャーブ語を書くための文字です。

パキスタンにもパンジャーブ語はよく話されていますが、グルムキー文字ではなく、アラビア文字が使われます。

02560.png

グジャラート文字

グジャラート文字またはグジャラーティー文字はインドのクジャラート州で話されるグジャラート語を書くための文字です。

02688.png

オリヤー文字

オリヤー文字はインドのオリッサ州で話されるオリヤー語を書くための文字です。

02816.png

タミル文字

タミル文字はインドの南部で広く話されているタミル語を書くための文字です。

インドの他にスリランカシンガポールでもタミル語がよく使われます。

02944.png

テルグ文字

テルグ文字アーンドラ・プラデーシュ州で話されているテルグ語を書くための文字です。

テルグ語はタミル語と同様にインドの南部でよく話されるドラヴィダ語族に属する言語です。

03072.png

カンナダ文字

カンナダ文字はインド南部のカルナータカ州で話されているカンナダ語を書くのに使う文字です。殆どはテルグ文字と似ています。

03200.png

マラヤーラム文字

マラヤーラム文字はインド南部のケーララ州で話されているマラヤーラム語を書くのに使う文字です。

03328.png

シンハラ文字

シンハラ文字スリランカで話されるシンハラ語を書くために使われる文字です。

03456.png

タイ文字

タイ文字タイの公用語であるタイ語を書くのに使う文字です。

03584.png

ラオス文字

ラオス文字またはラーオ文字ラオスの公用語であるラオス語を書くのに使う文字です。

殆どはタイ文字と似ていますが、一部の文字は現代で使われず、つい最近ユニコードに追加されたばかりのものなので、Noto Serif Laoのフォントに含まれなくて、ここで表示できなくて残念です。

03712.png

チベット文字

チベット文字チベット語など中国のチベット自治区で話される言語を書くために使われる文字です。その他にブータンの国語であるゾンカ語にも使われます。

03840.png

ビルマ文字

ビルマ文字ビルマ語モン語などミャンマー(ビルマ)で話される様々な言語を書くのに使われる文字です。

04096.png

グルジア文字

グルジア文字ジョージア(グルジア)の公用語であるグルジア語を書くのに使われる文字です。その他に、ジョージアで話されるメグレル語アブハズ語オセット語にも使われます。

04256.png

タガログ文字

タガログ文字またはバイバイン文字はかつてフィリピンの公用語であるタガログ語を書くのに使われていた文字ですが、現在のタガログ語は主にラテン文字が使われるので、とっくに廃止された文字です。

05888.png

ハヌノオ文字、ブヒッド文字、タグバヌア文字

ハヌノオ文字ブヒッド文字タグバヌア文字は、フィリピンのミンドロ島パラワン島で話される言語を書くために使われる文字です。ただし、どれも現在殆ど使わていません。

05920.png
05952.png
05984.png

クメール文字

クメール文字カンボジアの公用語であるクメール語を書くのに使われる文字です。

タイ文字やラオス文字はクメール文字から発展したものなので大体似ています。

06016.png

モンゴル文字

モンゴル文字モンゴル語満州語に使われる縦書きのアブギダです。ただし現在モンゴル国でモンゴル語はキリル文字の方が一般に使われています。

中国の内モンゴルではモンゴル文字がまだ広く使われていますが、縦書きしなければならない文字なので、現在のコンピューターや印刷で使う時には他の文字よりも面倒です。

06144.png

リンブ文字

リンブ文字はインドやネパールの少数民族の言語であるリンブー語を書くために使われる文字です。

06400.png

タイ・ナ文字

タイ・ナ文字は、中国の雲南省の少数民族の話される傣那(タイ・ナ)語を書くために使う文字です。

06480.png

新タイロ文字

タイ・ロ文字は中国の雲南省シーサンパンナ・タイ族自治州で使われている文字です。タイ・ロ文字は昔から存在していたものですが、「新タイロ文字」ってのは1955年に、本来のタイ・ロ文字から改編して新しく作られた文字です。

06528.png

ブギス文字

ブギス文字は、かつてインドネシアのスラウェシで話されているブギス語を書くのに使われていた文字ですが、現在ブギス語は主にラテン文字で表記されるので、もう殆ど使われていません。

06656.png

タイタム文字

タイタム文字またはラーンナー文字はタイの北部で使われていた北タイ語の文字ですが、現在タイ文字に置き換わっているので殆ど使われていません。

ビルマ文字から発展した文字なので、よく似ています。

06688.png

バリ文字、スンダ文字、バタク文字

バリ文字スンダ文字バタク文字はインドネシアで使われているバリ語スンダ語バタク語を書くために使われていた文字ですが、現在どれも殆どラテン文字が変わりに使われているので、廃止されたのです。

06912.png

07040.png

07104.png

レプチャ文字

レプチャ文字はインド北部で話されているレプチャ語字を書くのに使う文字です。

07168.png

オルチキ文字

オルチキ文字は南アジアの色んな国で話されているサンタル語を書くためのアルファベットですが、現在ラテン文字の方が広く使われています。

07248.png

シロティ・ナグリ文字

シロティ・ナグリ文字はバングラデシュやインド東北部で話されているシレット語に使われていたのですが、現在は代わりにベンガル文字が使われます。

43008.png

パスパ文字

パスパ文字はモンゴル文字と同じく、モンゴル語の縦書きの文字です。モンゴルのクビライ時代に発明されて、モンゴル文字の代わりに広く使われていたが、元朝が滅んだ後廃止されました。

43072.png

サウラーシュトラ文字

サウラーシュトラ文字は、インドで話されているサウラーシュトラ語を書く文字ですが、他にもタミル文字やデーヴァナーガリーも使われます。

43136.png

カヤー文字

カヤー文字は、ミャンマーの少数民族の言語であるカヤー語を書くために1962年に発明された文字ですが、現在広く使われていません。

43264.png

ルジャン文字

ルジャン文字は、かつてインドネシアのスマトラ島で話されるレジャン語に使われていた文字でした。マレー語にも使われていました。

43312.png

ジャワ文字

ジャワ文字は、かつてインドネシアのジャワ語(Javascriptではありません)を書くのに使われていた文字ですが、現在ラテン文字が一般に使われているので、廃止されました。

43392.png

チャム文字

チャム文字はベトナムに住んでいるチャム族という少数民族に話されているチャム語を書くの使われる文字です。その他にチャム語にはアラビア文字も使われています。

43520.png

タイ・ヴィエト文字

タイ・ヴィエト文字は、タイ諸語に属する色んな言語に使われていた文字ですが、現在あまり使われていません。

43648.png

メイテイ文字

メイテイ文字またはマニプル文字は、かつてインドのマニプル州で話されているマニプリ語に使っていた文字ですが、現在のマニプラ語は主にベンガル文字を使っています。

43968.png

カローシュティー文字

カローシュティー文字はかつて古代南アジアで使われていた文字です。

68096.png

突厥文字

突厥(とっけつ)文字はかつて古テュルク語を書くのに使われていたアルファベットです。フェニキア文字と似て、右から左へ書くのです。

68608.png

ブラーフミー文字

ブラーフミー文字は古代南アジアで使われていた文字です。現在使われていませんが、デーヴァナーガリーなど殆どの南アジア文字の祖先的存在です。ブラーフミー文字の子孫達は「ブラーフミー系文字」と呼ばれます。

69632.png

カイティー文字

カイティー文字はかつて南アジアで使われていたろブラーフミー系文字の一種です。アワディー語の表記に使われていたが、現在のアワディー語はデーヴァナーガリー文字を使っています。

69760.png

ソラングソンペング文字

ソラングソンペング文字はインドのソーラー語を書くために1936年に考案された文字です。

69840.png

チャクマ文字

チャクマ文字はバングラデシュやインドで話されているチャクマ語を書くために使われる文字です。ビルマ文字から発展したものなのでよく似ています。

69888.png

マハージャニー文字

マハージャニー文字はかつてインドで使われていたブラーフミー系文字の一種です。

69968.png

シャーラダー文字

シャーラダー文字はかつてインドで使われていたブラーフミー系文字の一種です。

70016.png

ホジャ文字

ホジャ文字はインドやパキスタンで話されているカッチ語シンド語を書くために使われていた文字です。

70144.png

ムルターニー文字、フダーワーディー文字、グランタ文字、ネワ文字

ムルターニー文字、フダーワーディー文字、グランタ文字、ネワ文字は南アジアで使われていたブラーフミー系文字ですが、どれも現在殆ど使われていません。

70272.png

70320.png

70400.png

70656.png

ティルフータ文字

ティルフータ文字またはマイティリー文字は、かつてインドのビハール州で話されているマイティリー語を書くために使われていた文字ですが、現在のマイティリー語はデーヴァナーガリーで書いているので、廃止されました。

70784.png

悉曇文字

悉曇文字または梵字は、かつてサンスクリットを書くために広く使われていたブラーフミー系文字です。

デーヴァナーガリー文字など色んなブラーフミー系文字は悉曇文字から発展したものです。

71040.png

モーディー文字

モーディー文字はかつてインドのマハーラーシュトラ州で話されているマラーティー語に使われていた文字ですが、現在のマラーティー語はデーヴァナーガリー文字で書いているので、モーディー文字は廃止された文字です。

71168.png

その他の文字

以上紹介した文字の他にもまだたくさんありますが、長くなりすぎるので説明は割愛して、画像だけ載せます。

タークリー文字

71296.png

アーホム文字

71424.png

ドーグリー文字

71680.png

ワラング・クシティ文字

71840.png

ザナバザル方形文字

72192.png

ソヨンボ文字

72272.png

パウ・チン・ハウ文字

72384.png

バイクシュキー文字

72704.png

マルチェン文字

72816.png

マサラム・ゴーンディー文字

72960.png

グンジャラ・ゴーンディー文字

73056.png

ムロ文字

92736.png

パハウ・フモン文字

92928.png

ミャオ文字

93952.png

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0