最近色んな国で使われている文字について興味を持っているので、たくさん勉強しています。
この世界には色んなタイプの文字が使われていますね。特にアジアの国ではバリエーションが多くて興味深いです。
そして現代のコンピューターはユニコードで色んな文字を表示することができて便利です。
ここではpythonを使って、各種類の文字を一気に羅列するpdfファイルを作成してみたいです。
基本
ここで主に使われるのはreportlabとpandasです。
reportlabの使い方はこれらの記事を参考に
- Pythonのreportlabの使い方まとめ
- PythonでPDFを生成するライブラリ比較まとめ
- reportlab の Table で日本語を使う
- PythonのPDF作成用ライブラリを試してみた。
文字のユニコードのブロックについてはこちら https://ja.wikipedia.org/wiki/ブロック_(Unicode)
ここで扱うのはアジアの国で使われるアルファベットとアブギダの音素文字のみです。アラビア文字みたいなアブジャドや、漢字みたいな表語文字は割愛します。
文字の情報
まずはデータの集まりです。該当する72種類の文字の情報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')
結果の画像は以下。
アルメニア文字
アルメニア文字は南コーカサス地方のアルメニアという小さな国で使われているアルメニア語を書く文字です。
ラテン文字と同じように横書きのアルファベットです。
ターナ文字
ターナ文字はモルディブという南アジアの島国の公用語であるディベヒ語を書くのに使われる文字です。
アラビア文字みたいに右から左へ書く文字ですが、アブジャドではなく、南アジアの多くの国に使われる文字と同じように、アブギダ文字です。
デーヴァナーガリー文字
デーヴァナーガリー文字はインドを中心とする南アジアの国で話されているヒンディー語、サンスクリット、ネパール語、マラーティー語などで広く使われている文字です。
ベンガル文字
ベンガル文字は南アジアのバングラデシュの公用語であるベンガル語を書くのに使う文字です。デーヴァナーガリーとよく似ています。その他にも、インド北東部のアッサム州で話されるアッサム語などにも使われます。(アッサム文字とも呼ばれるが、ユニコードはベンガル文字と一緒)
グルムキー文字
グルムキー文字はインドのパンジャーブ州で話されるパンジャーブ語を書くための文字です。
パキスタンにもパンジャーブ語はよく話されていますが、グルムキー文字ではなく、アラビア文字が使われます。
グジャラート文字
グジャラート文字またはグジャラーティー文字はインドのクジャラート州で話されるグジャラート語を書くための文字です。
オリヤー文字
オリヤー文字はインドのオリッサ州で話されるオリヤー語を書くための文字です。
タミル文字
タミル文字はインドの南部で広く話されているタミル語を書くための文字です。
インドの他にスリランカやシンガポールでもタミル語がよく使われます。
テルグ文字
テルグ文字はアーンドラ・プラデーシュ州で話されているテルグ語を書くための文字です。
テルグ語はタミル語と同様にインドの南部でよく話されるドラヴィダ語族に属する言語です。
カンナダ文字
カンナダ文字はインド南部のカルナータカ州で話されているカンナダ語を書くのに使う文字です。殆どはテルグ文字と似ています。
マラヤーラム文字
マラヤーラム文字はインド南部のケーララ州で話されているマラヤーラム語を書くのに使う文字です。
シンハラ文字
シンハラ文字はスリランカで話されるシンハラ語を書くために使われる文字です。
タイ文字
ラオス文字
ラオス文字またはラーオ文字はラオスの公用語であるラオス語を書くのに使う文字です。
殆どはタイ文字と似ていますが、一部の文字は現代で使われず、つい最近ユニコードに追加されたばかりのものなので、Noto Serif Laoのフォントに含まれなくて、ここで表示できなくて残念です。
チベット文字
チベット文字はチベット語など中国のチベット自治区で話される言語を書くために使われる文字です。その他にブータンの国語であるゾンカ語にも使われます。
ビルマ文字
ビルマ文字はビルマ語やモン語などミャンマー(ビルマ)で話される様々な言語を書くのに使われる文字です。
グルジア文字
グルジア文字はジョージア(グルジア)の公用語であるグルジア語を書くのに使われる文字です。その他に、ジョージアで話されるメグレル語、アブハズ語、オセット語にも使われます。
タガログ文字
タガログ文字またはバイバイン文字はかつてフィリピンの公用語であるタガログ語を書くのに使われていた文字ですが、現在のタガログ語は主にラテン文字が使われるので、とっくに廃止された文字です。
ハヌノオ文字、ブヒッド文字、タグバヌア文字
ハヌノオ文字、ブヒッド文字、タグバヌア文字は、フィリピンのミンドロ島やパラワン島で話される言語を書くために使われる文字です。ただし、どれも現在殆ど使わていません。
クメール文字
クメール文字はカンボジアの公用語であるクメール語を書くのに使われる文字です。
タイ文字やラオス文字はクメール文字から発展したものなので大体似ています。
モンゴル文字
モンゴル文字はモンゴル語や満州語に使われる縦書きのアブギダです。ただし現在モンゴル国でモンゴル語はキリル文字の方が一般に使われています。
中国の内モンゴルではモンゴル文字がまだ広く使われていますが、縦書きしなければならない文字なので、現在のコンピューターや印刷で使う時には他の文字よりも面倒です。
リンブ文字
リンブ文字はインドやネパールの少数民族の言語であるリンブー語を書くために使われる文字です。
タイ・ナ文字
タイ・ナ文字は、中国の雲南省の少数民族の話される傣那(タイ・ナ)語を書くために使う文字です。
新タイロ文字
タイ・ロ文字は中国の雲南省シーサンパンナ・タイ族自治州で使われている文字です。タイ・ロ文字は昔から存在していたものですが、「新タイロ文字」ってのは1955年に、本来のタイ・ロ文字から改編して新しく作られた文字です。
ブギス文字
ブギス文字は、かつてインドネシアのスラウェシで話されているブギス語を書くのに使われていた文字ですが、現在ブギス語は主にラテン文字で表記されるので、もう殆ど使われていません。
タイタム文字
タイタム文字またはラーンナー文字はタイの北部で使われていた北タイ語の文字ですが、現在タイ文字に置き換わっているので殆ど使われていません。
ビルマ文字から発展した文字なので、よく似ています。
バリ文字、スンダ文字、バタク文字
バリ文字、スンダ文字、バタク文字はインドネシアで使われているバリ語、スンダ語、バタク語を書くために使われていた文字ですが、現在どれも殆どラテン文字が変わりに使われているので、廃止されたのです。
レプチャ文字
レプチャ文字はインド北部で話されているレプチャ語字を書くのに使う文字です。
オルチキ文字
オルチキ文字は南アジアの色んな国で話されているサンタル語を書くためのアルファベットですが、現在ラテン文字の方が広く使われています。
シロティ・ナグリ文字
シロティ・ナグリ文字はバングラデシュやインド東北部で話されているシレット語に使われていたのですが、現在は代わりにベンガル文字が使われます。
パスパ文字
パスパ文字はモンゴル文字と同じく、モンゴル語の縦書きの文字です。モンゴルのクビライ時代に発明されて、モンゴル文字の代わりに広く使われていたが、元朝が滅んだ後廃止されました。
サウラーシュトラ文字
サウラーシュトラ文字は、インドで話されているサウラーシュトラ語を書く文字ですが、他にもタミル文字やデーヴァナーガリーも使われます。
カヤー文字
カヤー文字は、ミャンマーの少数民族の言語であるカヤー語を書くために1962年に発明された文字ですが、現在広く使われていません。
ルジャン文字
ルジャン文字は、かつてインドネシアのスマトラ島で話されるレジャン語に使われていた文字でした。マレー語にも使われていました。
ジャワ文字
ジャワ文字は、かつてインドネシアのジャワ語(Javascriptではありません)を書くのに使われていた文字ですが、現在ラテン文字が一般に使われているので、廃止されました。
チャム文字
チャム文字はベトナムに住んでいるチャム族という少数民族に話されているチャム語を書くの使われる文字です。その他にチャム語にはアラビア文字も使われています。
タイ・ヴィエト文字
タイ・ヴィエト文字は、タイ諸語に属する色んな言語に使われていた文字ですが、現在あまり使われていません。
メイテイ文字
メイテイ文字またはマニプル文字は、かつてインドのマニプル州で話されているマニプリ語に使っていた文字ですが、現在のマニプラ語は主にベンガル文字を使っています。
カローシュティー文字
カローシュティー文字はかつて古代南アジアで使われていた文字です。
突厥文字
突厥(とっけつ)文字はかつて古テュルク語を書くのに使われていたアルファベットです。フェニキア文字と似て、右から左へ書くのです。
ブラーフミー文字
ブラーフミー文字は古代南アジアで使われていた文字です。現在使われていませんが、デーヴァナーガリーなど殆どの南アジア文字の祖先的存在です。ブラーフミー文字の子孫達は「ブラーフミー系文字」と呼ばれます。
カイティー文字
カイティー文字はかつて南アジアで使われていたろブラーフミー系文字の一種です。アワディー語の表記に使われていたが、現在のアワディー語はデーヴァナーガリー文字を使っています。
ソラングソンペング文字
ソラングソンペング文字はインドのソーラー語を書くために1936年に考案された文字です。
チャクマ文字
チャクマ文字はバングラデシュやインドで話されているチャクマ語を書くために使われる文字です。ビルマ文字から発展したものなのでよく似ています。
マハージャニー文字
マハージャニー文字はかつてインドで使われていたブラーフミー系文字の一種です。
シャーラダー文字
シャーラダー文字はかつてインドで使われていたブラーフミー系文字の一種です。
ホジャ文字
ホジャ文字はインドやパキスタンで話されているカッチ語やシンド語を書くために使われていた文字です。
ムルターニー文字、フダーワーディー文字、グランタ文字、ネワ文字
ムルターニー文字、フダーワーディー文字、グランタ文字、ネワ文字は南アジアで使われていたブラーフミー系文字ですが、どれも現在殆ど使われていません。
ティルフータ文字
ティルフータ文字またはマイティリー文字は、かつてインドのビハール州で話されているマイティリー語を書くために使われていた文字ですが、現在のマイティリー語はデーヴァナーガリーで書いているので、廃止されました。
悉曇文字
悉曇文字または梵字は、かつてサンスクリットを書くために広く使われていたブラーフミー系文字です。
デーヴァナーガリー文字など色んなブラーフミー系文字は悉曇文字から発展したものです。
モーディー文字
モーディー文字はかつてインドのマハーラーシュトラ州で話されているマラーティー語に使われていた文字ですが、現在のマラーティー語はデーヴァナーガリー文字で書いているので、モーディー文字は廃止された文字です。
その他の文字
以上紹介した文字の他にもまだたくさんありますが、長くなりすぎるので説明は割愛して、画像だけ載せます。