初歩のシェルスクリプトで遊ぶ[ぬかみそフォントの制作サポート(6)]
複数のUnicodeがひとつのCIDを指すとき
TTEditのTrueTypeフォントを、OTEditでOpenTypeフォントに変換するとき、殆どの文字は、ひとつのunicodeの文字が、ひとつのCIDにコピーされます。一対一になってる。
a → a b → b c → c
ところが、複数のunicode文字が、一つのCID文字にコピーされる文字も、そこそこある。
a → a b → a c → a
ここまでおかしなのは無いですが、例として。「a」「b」「c」のunicodeのグリフが、もし「a」のCIDにコピーされるとしたら。aはaにコピーされ、次にbもaに上書きコピーされ、さらにcもaに上書きコピーされる。結果、「a」に「c」のグリフがコピーされてしまう、「a」「b」が消えてしまう、ということです。
$ cat ./OTEdit12-8_Uni_Pr6N_Pro_Char.csv | head 32 0020 1 1 33 0021 2 2 ! 34 0022 3 3 " 35 0023 4 4 # 36 0024 5 5 $ 37 0025 6 6 % 38 0026 7 7 & 39 0027 8 8 ' 40 0028 9 9 ( 41 0029 10 10 ) $ cat ./OTEdit12-8_Uni_Pr6N_Pro_Char.csv |awk '{ printf "%05d\t%s\n" , $3 ,$0 }' | sort -V -k 1 | uniq -D -w 5 00001 32 0020 1 1 00001 160 00A0 1 1 00014 45 002D 14 14 - 00014 8209 2011 14 14 ‑ 00064 95 005F 64 64 _ 00064 818 0332 64 64 00065 96 0060 65 65 ` 00065 768 0300 65 65 00095 732 02DC 95 95 ˜ 00095 771 0303 95 95 00096 700 02BC 96 96 ʼ 00096 8217 2019 96 96 ’ 00098 699 02BB 98 98 ʻ 00098 8216 2018 98 98 ‘ 00100 126 007E 100 100 ~ 00100 8764 223C 100 100 ∼ 00114 8210 2012 114 114 ‒ 00114 8211 2013 114 114 – 00117 183 00B7 117 117 · 00117 8729 2219 117 117 ∙
「unicode(dec),unicode(hex),CID204,CID90,文字」の並びのテキストファイル表を、CID2004でソート。さらにCIDが重複した行のみ抜き出します。
見た目が近いUnicodeのグリフは、まとめて一カ所のCIDを指し示している、ということのようです。
これは例えば、TrueTypeフォントをOTEditの「一括コピー」でOpenTypeフォントにコピーすると、「002D」と「2011」は、同じ「CID14」にコピーされる、ということを意味してます。
「002D」はASCIIの半角ハイフン、「2011」はunicodeの無改行ハイフンです。もし、あるTrueTypeフォントにASCIIの半角ハイフンと、無改行ハイフンの両方にグリフが作ってあれば、これをOTEditでOpenTypeフォントに一括コピーすると、「CID14」は二度書きされます。
もしASCIIのハイフンと、無改行ハイフンのグリフを異なるデザインにしていたならば、無改行ハイフンのほうがOpenTypeには残ってしまう。
コピー先のOpenTypeに、どのUnicodeのグリフがコピーされるのか。複数のUnicodeが同一のCIDを指し示している文字については、注意しなきゃなんない、ということです。
「文字一覧の表示」用のテキストデータを作る
上の例では、サンプルの文字も含めたcsvファイルから作りました。が、今回は、武蔵システム配布のエクセルファイルを、LibreOfficeでcsvに変換したファイルに戻ったほうが、簡単です。
#!/bin/bash # =============================================================================== # ■ OTEditでCIDに重複してコピーされるUnicodeの文字一覧 (bash) # # ・input # unicode(HEX) CID # # ひとつのCIDに複数のunicodeが対応しているとき、 # そのunicode文字を1行にまとめて出力する # # =============================================================================== # 1行前のCID preCID=0 awk -e '{ printf "%05d\t%s\n" , $2 ,$1 }' | sort -k 1 | uniq -D -w 5 | while read cID uniCode ; do if test ${preCID} -ne ${cID} ; then # もしCIDが前行のCIDと異なるなら(増えてるなら)、 # 区切りの1行を挟み込む echo '_ _' echo "${cID} ${uniCode}" else echo "${cID} ${uniCode}" fi preCID=${cID} done | cut -f 2 | tr '\n' '\t' | { tr _ '\n' ; echo ; } | while read Line ; do for XX in ${Line} ; do printf "\U${XX}" done echo done | sed -e '/^$/d'
$ cat ./1-7.csv |head 0020 1 0021 2 0022 3 0023 4 0024 5 0025 6 0026 7 0027 8 0028 9 0029 10 $ cat ./1-7.csv | ./ttedit_20210309_01.sh -‑ _̲ `̀ ˜̃ ʼ’ ʻ‘ ~∼ ‒– ·∙ ˆ̂ ¯̄ ˚̊ ¸̧ — ‾ 〜~ −- ⾐衣 ⼀一 ⽻羽 ⾬雨 ⾅臼 ⽠瓜 ⻩黄
という感じに、続きます。これをiconvでUTF-16に変換、保存して、TTEditから読み込めば、重複コピーされる文字を一覧できます。
サンプル画像に使ったテキストファイルは、シェルスクリプトの出力したUTF-8のテキストデータを、「iconv -t utf-16」で変換したものです。
テキストエディタと、このブログからのコピペでも、だいたいなんとかなるみたいなんですが、文字が入れ替わってしまうみたいです。最初の半角空白とかが。
UTF-16で保存する_同一CIDを複数Unicodeが指し示す文字.txt
-‑ _̲ `̀ ˜̃ ʼ’ ʻ‘ ~∼ ‒– ·∙ ˆ̂ ¯̄ ˚̊ ¸̧ ̶— ̅‾ 〜~ −- ⾐衣 ⼀一 ⽻羽 ⾬雨 ⾅臼 ⽠瓜 ⻩黄 ⼄乙 ⾳音 ⽕火 ⽲禾 ⾙貝 ⾓角 ⾰革 ⽡瓦 ⼲干 ⽢甘 ⽸缶 ⻤⿁鬼 ⻲亀 ⿉黍 ⼸弓 ⽜牛 ⿂魚 ⽟玉 ⼱巾 ⽄斤 ⾦金 ⽋欠 ⽳穴 ⾎血 ⽉月 ⽝犬 ⾒見 ⽞玄 ⾔言 ⼰己 ⼾戸 ⻁虎 ⿎鼓 ⼝口 ⼯工 ⾏行 ⾹香 ⾼高 ⿊黒 ⾻骨 ⾉艮 ⽫皿 ⼭山 ⼠士 ⼦子 ⽀支 ⽌止 ⽒氏 ⽷糸 ⾄至 ⻭歯 ⽰示 ⽽而 ⽿耳 ⾃自 ⿅鹿 ⾞車 ⼿手 ⾸首 ⾈舟 ⼗十 ⼥女 ⼩小 ⾊色 ⾷食 ⼼心 ⾂臣 ⾝身 ⾟辛 ⼈人 ⽔水 ⼨寸 ⽣生 ⻄西 ⻘青 ⻫斉 ⽯石 ⾚赤 ⾆舌 ⾇舛 ⿏鼠 ⾛走 ⾜足 ⼤大 ⾠辰 ⾕谷 ⽵竹 ⾍虫 ⻑⾧長 ⿃鳥 ⽖爪 ⿍鼎 ⽥田 ⽃斗 ⼟土 ⼑刀 ⾖豆 ⾣酉 ⼆二 ⾁肉 ⽇日 ⼊入 ⾺馬 ⽩白 ⻨麦 ⼋八 ⾤釆 ⽐比 ⽪皮 ⾮非 ⾶飛 ⿐鼻 ⽦疋 ⽗父 ⾩阜 ⾵風 ⽂文 ⽶米 ⾴頁 ⽚片 ⺟母 ⽅方 ⼘卜 ⿇麻 ⼜又 ⺒巳 ⺠民 ⽭矛 ⾯面 ⽑毛 ⽊木 ⽬目 ⾨門 ⽮矢 ⾢邑 ⼣夕 ⽤用 ⽺羊 ⾥里 ⽴立 ⻯竜 ⿓龍 ⼒力 ⽼老 ⼂丶 ⼃丿 ⼅亅 ⼇亠 ⼉儿 ⺎兀 ⼌冂 ⼍冖 ⼎冫 ⼏几 ⼐凵 ⼓勹 ⼔匕 ⼕匚 ⼖匸 ⼙卩 ⼚厂 ⼛厶 ⼞囗 ⼡夂 ⼢夊 ⼧宀 ⺐⼪尢 ⼫尸 ⼬屮 ⼮巛 ⺓⼳幺 ⼴广 ⼵廴 ⼶廾 ⼷弋 ⺔彑 ⼺彡 ⼻彳 ⼽戈 ⽁攴 ⺙攵 ⽆无 ⺛旡 ⽈曰 ⽍歹 ⽎殳 ⽏毋 ⽓气 ⽘爻 ⽙爿 ⽨癶 ⽹网 ⽾耒 ⾀聿 ⾋艸 ⾌虍 ⾑襾 ⾗豕 ⾘豸 ⾪隶 ⾫隹 ⾱韋 ⾲韭 ⾽髟 ⾾鬥 ⾿鬯 ⿀鬲 ⿄鹵 ⿆麥 ⿋黹 ⿌黽 ⿑齊 ⿒齒 ⿔龜 ⿕龠 櫛櫛 杓杓 溺溺 屠屠 漣漣 煉煉 冤冤 ⁝︙ ⁚︰ ⽛牙 ⼁丨 ⾭靑 ⎜⎟⎢⎥⎪ ⿈黃 𦥑⺽ ⻟飠 𩙿⻞ ⺗㣺 ⺅亻 ⻃覀 𧾷⻊ 𥫗⺮ 𤴔⺪ ⺹耂 𠘨⺇ 𠦄卉 ⺋㔾 𣏌杞 ⺦丬 𦉪⺳ ⺾艹 ⺿艹 ⻀艹 ⺃乚 ⺉刂 ⺏尣 ⼹彐 ⺖忄 ⺘扌 ⺡氵 ⺣灬 ⺨犭 ⽧疒 ⺭礻 ⽱禸 ⺫⺲罒 ⺱罓 ⻂衤 ⾡辵 ⻍辶 ⻒镸 ⻏⻖阝 ⺤爫 ⻌辶 ⺞歺 𩿎𩿗 𣟱櫸