前書き
http://d.hatena.ne.jp/silenvx/20120929/1348930210
以前こんな記事を書いてcharmapsのUTF-8.gzを改造してUTF-8-CJK.gzを生成した
のはいいけど新しい環境に行くたびにやるのがめんどくさいんでPKGBUILD書いた
本文
https://github.com/silenvx/PKGBUILD.git
ここのutf-8-cjkにおいた
書くためにやったこと
まずUTF-8.gzがどんな方法で追加されてるのか調べる
% pkgfile UTF-8.gz core/glibc
glibcでインストールされていることがわかったので生成方法を調べるためにソースコードをダウンロード
% yaourt -G glibc % cd glibc % makepkg -o % cd src
次に生成に関連してそうなキーワードとして生成元のデータが書かれているEastAsianWidth.txtで検索
% find . -type f -exec grep -nH "EastAsianWidth.txt" {} + ./src/glibc/localedata/unicode-gen/utf8_gen.py:25:Usage: python3 utf8_gen.py UnicodeData.txt EastAsianWidth.txt ./src/glibc/localedata/unicode-gen/utf8_gen.py:205: outfile.write('% "grep \'^[^;]*;[WF]\' EastAsianWidth.txt"\n') ./src/glibc/localedata/unicode-gen/utf8_gen.py:220: EastAsianWidth.txt ./src/glibc/localedata/unicode-gen/utf8_gen.py:231: # If an entry in EastAsianWidth.txt is found, it overrides entries in ./src/glibc/localedata/unicode-gen/utf8_gen.py:252: print("USAGE: python3 utf8_gen.py UnicodeData.txt EastAsianWidth.txt") ./src/glibc/localedata/unicode-gen/utf8_gen.py:267: # the EastAsianWidth.txt file. ./src/glibc/localedata/unicode-gen/utf8_gen.py:277: # Processing EastAsianWidth.txt and write WIDTH to UTF-8 file ./src/glibc/localedata/unicode-gen/utf8_compatibility.py:240: help='The EastAsianWidth.txt file to read.') ./src/glibc/localedata/unicode-gen/Makefile:43:DOWNLOADS = UnicodeData.txt DerivedCoreProperties.txt EastAsianWidth.txt ./src/glibc/localedata/unicode-gen/Makefile:93:UTF-8: UnicodeData.txt EastAsianWidth.txt ./src/glibc/localedata/unicode-gen/Makefile:95: $(PYTHON3) utf8_gen.py UnicodeData.txt EastAsianWidth.txt ./src/glibc/localedata/unicode-gen/Makefile:100: -e EastAsianWidth.txt -o ../charmaps/UTF-8 \ ./src/glibc/localedata/charmaps/GB18030:88685:% "grep '^[^;]*;[AWF]' EastAsianWidth.txt" ./src/glibc/localedata/charmaps/GB18030:88686:% and "grep '^[^;]*;[^AWF]' EastAsianWidth.txt" ./src/glibc/localedata/charmaps/UTF-8:43789:% "grep '^[^;]*;[WF]' EastAsianWidth.txt" ./src/glibc/localedata/ChangeLog:69: * unicode-gen/EastAsianWidth.txt: Likewise. ./src/glibc/localedata/ChangeLog:102: (UTF-8-report): Reference UnicodeData.txt and EastAsianWidth.txt. ./src/glibc/localedata/ChangeLog:237: * unicode-gen/EastAsianWidth.txt: New, from Unicode. Binary file ./src/glibc/.git/index matches ./src/glibc/benchtests/strcoll-inputs/filelist#en_US.UTF-8:10925:EastAsianWidth.txt
ChangeLogは関係なさそうなので
./src/glibc/localedata/unicode-gen/のMakefileからutf8-gen.pyを呼び出してるのがわかる
Makefileを見たら
UTF-8: UnicodeData.txt EastAsianWidth.txt UTF-8: utf8_gen.py $(PYTHON3) utf8_gen.py UnicodeData.txt EastAsianWidth.txt
これしかしてない
なのでutf8_gen.pyをmain関数から追って行くと
if re.match(r'^[^;]*;[WF]', LINE):
この部分で2文字分の幅の文字をhitさせていたのでAを追加して
if re.match(r'^[^;]*;[WFA]', LINE):
こんな感じにして実行したらうまい具合に動いたのでこれでおk
後はPKGBUILDを書くだけだけどglibcにpatch当てる形式じゃ毎回コンパイル糞みたいにかかる上に
システムのUTF-8.gzをいじるのは嫌だったので新たにUTF-8-CJK.gzを追加するようにした