初歩のシェルスクリプトで遊ぶ[ぬかみそフォントの制作サポート(6)]

複数のUnicodeがひとつのCIDを指すとき

TTEditTrueTypeフォントを、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ファイルから作りました。が、今回は、武蔵システム配布のエクセルファイルを、LibreOfficecsvに変換したファイルに戻ったほうが、簡単です。

#!/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

  
-‑
_̲
`̀
˜̃
ʼ’
ʻ‘
~∼
‒–
·∙
ˆ̂
¯̄
˚̊
¸̧
̶—
̅‾
  
〜~
−-
⾐衣
⼀一
⽻羽
⾬雨
⾅臼
⽠瓜
⻩黄
⼄乙
⾳音
⽕火
⽲禾
⾙貝
⾓角
⾰革
⽡瓦
⼲干
⽢甘
⽸缶
⻤⿁鬼
⻲亀
⿉黍
⼸弓
⽜牛
⿂魚
⽟玉
⼱巾
⽄斤
⾦金
⽋欠
⽳穴
⾎血
⽉月
⽝犬
⾒見
⽞玄
⾔言
⼰己
⼾戸
⻁虎
⿎鼓
⼝口
⼯工
⾏行
⾹香
⾼高
⿊黒
⾻骨
⾉艮
⽫皿
⼭山
⼠士
⼦子
⽀支
⽌止
⽒氏
⽷糸
⾄至
⻭歯
⽰示
⽽而
⽿耳
⾃自
⿅鹿
⾞車
⼿手
⾸首
⾈舟
⼗十
⼥女
⼩小
⾊色
⾷食
⼼心
⾂臣
⾝身
⾟辛
⼈人
⽔水
⼨寸
⽣生
⻄西
⻘青
⻫斉
⽯石
⾚赤
⾆舌
⾇舛
⿏鼠
⾛走
⾜足
⼤大
⾠辰
⾕谷
⽵竹
⾍虫
⻑⾧長
⿃鳥
⽖爪
⿍鼎
⽥田
⽃斗
⼟土
⼑刀
⾖豆
⾣酉
⼆二
⾁肉
⽇日
⼊入
⾺馬
⽩白
⻨麦
⼋八
⾤釆
⽐比
⽪皮
⾮非
⾶飛
⿐鼻
⽦疋
⽗父
⾩阜
⾵風
⽂文
⽶米
⾴頁
⽚片
⺟母
⽅方
⼘卜
⿇麻
⼜又
⺒巳
⺠民
⽭矛
⾯面
⽑毛
⽊木
⽬目
⾨門
⽮矢
⾢邑
⼣夕
⽤用
⽺羊
⾥里
⽴立
⻯竜
⿓龍
⼒力
⽼老
⼂丶
⼃丿
⼅亅
⼇亠
⼉儿
⺎兀
⼌冂
⼍冖
⼎冫
⼏几
⼐凵
⼓勹
⼔匕
⼕匚
⼖匸
⼙卩
⼚厂
⼛厶
⼞囗
⼡夂
⼢夊
⼧宀
⺐⼪尢
⼫尸
⼬屮
⼮巛
⺓⼳幺
⼴广
⼵廴
⼶廾
⼷弋
⺔彑
⼺彡
⼻彳
⼽戈
⽁攴
⺙攵
⽆无
⺛旡
⽈曰
⽍歹
⽎殳
⽏毋
⽓气
⽘爻
⽙爿
⽨癶
⽹网
⽾耒
⾀聿
⾋艸
⾌虍
⾑襾
⾗豕
⾘豸
⾪隶
⾫隹
⾱韋
⾲韭
⾽髟
⾾鬥
⾿鬯
⿀鬲
⿄鹵
⿆麥
⿋黹
⿌黽
⿑齊
⿒齒
⿔龜
⿕龠
櫛櫛
杓杓
溺溺
屠屠
漣漣
煉煉
冤冤
⁝︙
⁚︰
⽛牙
⼁丨
⾭靑
⎜⎟⎢⎥⎪
⿈黃
𦥑⺽
⻟飠
𩙿⻞
⺗㣺
⺅亻
⻃覀
𧾷⻊
𥫗⺮
𤴔⺪
⺹耂
𠘨⺇
𠦄卉
⺋㔾
𣏌杞
⺦丬
𦉪⺳
⺾艹
⺿艹
⻀艹
⺃乚
⺉刂
⺏尣
⼹彐
⺖忄
⺘扌
⺡氵
⺣灬
⺨犭
⽧疒
⺭礻
⽱禸
⺫⺲罒
⺱罓
⻂衤
⾡辵
⻍辶
⻒镸
⻏⻖阝
⺤爫
⻌辶
⺞歺
𩿎𩿗
𣟱櫸