電子書籍でエラーになる絵文字の検知

今回のエントリは。
経緯
・電子書籍でエラーになるのが絵文字だった。
・元データから絵文字を検知する必要が出てきた。
結論
・perlを使えば絵文字のチェックも簡単だった。
てことなんだけど、調べてみたらunicodeまわりが魔窟でびっくり。またハマりそうなのでメモ。
以下は、何を今さらという話が無駄に長くて、既知のかたには役に立たない内容です。
電子書籍に求められる基準はほぼ以下のふたつ
・Epubcheckでエラーはない。
・kindle previewerでエラーはない。
epubcheckでエラーがなければEPUB3の電子書籍として問題はないし、kindle perviewerでエラーをチェックするのは最大の配信サイトであるAmazonでエラーがあったら商売上よろしくないから。
上記2つのチェックをクリアしたのに、一部の配信サイトでエラーになるという指摘があって、追いかけてみると、問題になったのが「絵文字」
「😀」←こういうやつ
原稿に絵文字があったんで、あれ?これってイケるんだっけと思って作ってみて、上記2つのチェックにかけてもエラーはなかった。
文字コードがShiftJISの時代ならともかく、今どきはutf8。
utf8のおかげで文字化けなんかを気にする必要はほぼなくなった。機種依存、環境依存文字に神経質にならなくていいのはストレスフリーで、いい時代になったもんだとのんきに感慨深い今日この頃だったのに…。
文字として問題はないんだけど、配信サイトごとにビューワーが違ってたりして、そのビューワーが絵文字に対応してるかどうかのことだと思う。
「EPUB | CSS組版ブログ」
https://blog.antenna.co.jp/CSSPage2/archives/category/epub
↑絵文字なんかについて、縦書きのepub3が始まった頃に議論があったらしい。
(電子書籍元年当時の話が読めるのでオススメ)
「横倒しのまま」にするのか「正立させる」のか。文字の意味的に方向があるものは正立させる?とか。そのあたりのすり合わせが問題になってたっぽい(という理解でいいのかなあ)
これは縦書きの場合、見た目けっこう致命的なので、たぶん、絵文字の対応を見送ったビューワー=配信サイトがあったんじゃないかと思う(憶測)
あるいは、そもそも、絵文字は環境ごとで見え方も違うのでそこが問題なのかもしれない(憶測)
そんなこんなの名残りもあって、面倒なものは却下、ということで今でもエラーにする配信サイトがある、んだろう(めっちゃ憶測)
epubcheckでもkindle previewerでもエラーにならない文字を自前で検知する必要にせまられる事態となった。
電子書籍のボリュームを目で追ってその中から絵文字を見つける、目視で探すなどありえない。必ず漏れが出る。
なもんで、絵文字の文字コードを調べてみて改めて今さらびっくりのunicodeだ。
ちなみに、文字を表示させるためには、以下の2本立てになっている。
・unicodeの文字コード表で文字を指定特定していて
・文字コードをエンコードすることで文字を表現する
これ、けっこう勘違いするんだけど、utf8というのは文字コードではなくてunicodeの文字コードをエンコードする方法の名前のこと。
以下のサイトを読んでまたびっくりすることをおすすめする。
「文字コード再入門 ─ Unicodeでのサロゲートペア、結合文字、正規化、書記素クラスタを理解しよう!」
https://en-ambi.com/itcontents/entry/2020/04/28/103000/
「書記素クラスタ - daiizfeel 2022」
https://isobe-yaki.hateblo.jp/entry/2023/07/20/194803
てのはともかく、読んでも難しいんで、なにか大変なことになってるんだなあ、でOK。
そもそもutf8でエンコードされた、日本語などは、ひと文字を表すのに、そのコードは3バイト使う。
ひとつの文字がアルファベットのように1バイトではないので
たとえば「日本語の文字」の6文字は、1つの文字に3バイトのコードが必要で、文字列の長さをバイト数でいうと18となる。
文字数いくつだっけ?て時に、バイト数の18ではなくて「正しく」6と数えるためにエンコードされている必要がある。
unicodeのコードをエンコードして初めて「文字として認識される」
このエンコードする方法がutf16だったりutf8とか呼ばれて、エンコードすることで初めて「文字として認識された文字を表示する=扱うことができる」という変な日本語。
perlの場合、utf8フラグというのを使うことで問題解決する。
my $str = '日本語の文字'
my $utf8 = Encode::decode('utf8',$str)
print length($str)
→18文字
print length($utf8)
→6文字
perlはこのおかげで、文字の扱いについて、普段はまずほとんど、こんな面倒くさいことを意識する必要はなくて、なもんで、すっかりわけがわからず混乱してしまったのが昨日今日の話、だ(とほほ
unicodeとutf8についてのおさらいができたところで、やっと本題。
じゃあ、絵文字を検知するには絵文字が使ってるコードを見つければいいだけじゃん。簡単だろ、と思ったらまたひと悶着。
ていうか、ここからが今回の本丸、一丁目一番地(死語)
utf8フラグだけでは解決しない「結合文字」というのがあった。
「1つの文字を表示しているのは、1つのunicodeのコードポイント」とは限らない。
ひとつの文字を表示、扱うのに、複数のunicodeのコードポイントを使ってるケースがあって、見た目のひと文字とそれを表すコードは1対1ではない、ということ。
perlでutf8フラグがついていてもutf8の文字コード(←unicodeコード表によるコードではなくてエンコード後の文字コード)2つ結合した文字はlength()では意図通りに取得できない。ひと文字として扱ってほしいのに、たとえば二文字としてカウントされてしまってお手上げ。
実のところ、書記素クラスタというのはこういう結合文字も含めた呼び方で、書記素クラスタに対応すれば「結合文字」も「ひと文字」として扱うことができる。書記素クラスタというのがなんだか「とても面倒くさい」というのはこのあたり。
こうなってくると、電子書籍でエラーをなくすために、なんでこんなことまで調べにゃならんのか。そもそもレアケースだし、配信サイト個別のクレーム対応でいいんじゃないのか。と思わないでもないけど。乗りかかった船だししょうがない。
話がそれた。
perlはこれも解決してくれる。て、テキストを扱わせたらperl最強じゃね?
「絵文字を含む文字列を分割~解説編~」
https://www.lemorin.jp/perl/3b_split_char.html
↑こちらのサイトに知りたいことのすべてがあった(多謝
my $line = Encode::decode('utf8', $_);
my $len = length($line);
print $len . "\n";
my @x = $line =~ m!\X!g;
print scalar(@x) . "\n";
length()では「見た目のひと文字」じゃなくて困ってたところ、perlでは「いい感じに」「ちゃんと」文字として認識できる文字のための正規表現「\X」が用意されてた。
「perlの正規表現」
https://perldoc.perl.org/perlrebackslash#Misc
ということで、やっと本エントリの締めとなります(長っ!
問題のない文字ダネを削除して残った文字を正規表現「\X」で配列に取り出して、「見た目のひと文字」をコードポイントにバラして16進表現して絵文字のコードに検索をかける。検索がヒットしたら、それはイコール絵文字。
「HTMLの絵文字 文字コード表」
https://gray-code.com/html_css/list-of-emoji/
↑絵文字のコードはこちらの一覧から拝借しました。
こちらで掲載されているコードを絵文字判定の対象としました。
これでやっと絵文字検知。
前から言ってるんだけど、人間の目視確認、手作業修正(目grep、手marge)なんて1mmも信用できない。特におれ。なので機械に頼めるなら機械に任せるのが正解。
↓こちらも参考になりました
「Perl 5.26 & Unicode 9.0 で変わる書記素クラスタ(grapheme cluster)のお話」
https://shogo82148.github.io/blog/2017/08/25/unicode9-grapheme-cluster/
「UTF-8の文字コード表」
https://orange-factory.com/dnf/utf-8.html
本エントリとはまったく関係ないけど。
この埼玉県八潮市の資料館はびっくりの充実。行く前は小学校の教室ぐらいなもんだろ、と思っててすみませんでした。
交通アクセスにちょっと難があって、気楽にとはいえないけど、行けるかたはぜひぜひ
https://www.city.yashio.lg.jp/kurashi/shisetsuguide/shiryokan/index.html
[08/25 16:58:54] いろいろ間違えてたので改稿
「文字につかうバイト数」と「コードポイント」を混用していた、という乱暴な理解だった(恥
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
AIでテキストから画像を生成

いま話題の画像生成AI「Stable diffusion」を使ってみた。
ローカルにダウロードしてPython環境、Anacondaとかを作ったりGitからStable Diffusionのソースコードを持ってくるのは大変なので、とりあえず、googleのcolabで使ってみた。
ほんとだったら、ローカルに構築するのがいいんだけど。
とりあえずアカウントが2つ必要。
・googleのアカウント
→gmailのアカウントで、ほとんどの人はすでに持ってるのでは?
・huggingfaceのアカウント
→これは持ってるひとが少ないと思うけど、簡単に作れる。
https://huggingface.co/settings/profile
わたしのようなド素人のヨタじゃなくて、以下のサイトがオススメ。
Google Colab で はじめる Stable Diffusion v1.4
https://note.com/npaka/n/ndd549d2ce556
[Stable Diffusion] AIでテキストから画像を生成する[Python]
https://www.12-technology.com/2022/08/stable-diffusion-aipython.html
とはいえ、自分メモ。
・huggingfaceでの作業
huggingfaceのアカウントを作ったらhuggingfaceのプロフィールページの左メニューからアクセストークン(ACCESS TOKEN)をクリックしてアクセストークンのページを開いてひとつ新規に生成して取得する。
権限にreadとwriteがあるけど、readで大丈夫だった。
・google colabでの作業
https://colab.research.google.com/?hl=ja
↑ここにアクセスしたらまずは下準備
「ノートブックを新規作成」
素っ気ないページになる。これ、古のターミナルみたいだな。
てのはともかく、やることは以下の4ステップだけ。
1)
「編集」→「ノートブックの設定」→「ハードウェアアクセラレータ」を「GPU」に設定。
2)
次にこの▶のところに以下のコマンドを入力。
!pip install diffusers==0.2.4 transformers scipy ftfy
▶をクリックするとコマンドが実行される。
3)
インストールが済んだら、「+コード」をクリック。
次のコマンドを入力欄を追加してライブラリのインポート…これをしないと、次のフェーズで403エラーになって止まってしまった。
from diffusers import StableDiffusionPipeline
import matplotlib.pyplot as plt
4)
そして以下で準備完了となる。
TOKEN="Huggingfaceで取得したトークンをコピペ"
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=TOKEN)
pipe.to("cuda")
準備が済んだらいよいよ画像を生成だ。
▶のところに
prompt = "Japanese Bobtail Cat on the Moon" #@param {type:"string"}
image = pipe(prompt)["sample"][0]
image.save("test01.png")
とやってできたのがこの画像
promptがキモ。ていうかAIにどんな画像を作らせるのかAIと話し合いになる。
今回は最初だし「Japanese Bobtail Cat on the Moon」とやってみたけど、そんなに面白い画像がすぐに出てくるわけでもなく、これにしても4回目ぐらい、だったかな。
デフォルト状態で1枚生成するのに20秒ほどだった。
「AIと話し合い」と書いたのはこのリクエストがすべてで、どんな画像を出せるかは話し合い次第。プロンプトをリクエストするひとの腕次第という意味もある。たぶんこの分野、こんな画像が欲しい、というのを翻案して噛み砕いてAIのわかる言葉で伝えるニーズがあるだろうな。
創造とか創作というのは人間や神様だけのものという聖域感がある。
だけど、神様については知らないけど、人間の創造もまったくゼロからというものではなく、いろんなもののインプットの坩堝があって初めてアウトプットが出てくる。
てことはこのAIもやってることは同じ、大量のデータをインプットされて学習したモデルから適当と思しきものを引っ張り出してそれらで合成して作り上げてアウトプットとする。
一部界隈が騒がしいのもわかる気がする。
ほんと、これはひととAIの棲み分け、区別というか、倫理の話にもなりそうだし、SFのネタが現実になりそう。
ちなみに生成した画像は権利関係的にはフリーなので(著作人格権とか肖像権にぶち当たることもありそうだけど)商用利用もOKとのこと。
とりあえずgoogleで使ってみたけど、いろんなパラメータをいじれるはずなのでローカルで構築してみたいとこだなあ…て、今うちで使ってるパソはグラフィックが弱いからパソコン買い替えになるだろうし、当分無理、か。ビンボはつらいぜ、ちくしょう。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ポケモンGo:宵越しの砂は持たない

レイドバトルが中心となると、高火力・高CPのポケモンが必要となってくる。
砂と飴で強化するんだけど、レベル30ぐらいは最低必要と言われている。強化のための砂が5000必要となって、そこからさらに一度強化するとレベル30らしい。
だけど、わたしは避けスキルがヘボだし、スマホのスペックもしょぼい。となると、レベルをできるだけ上げてHPも上げておきたい。
強化したいポケモンというのが。
バンギラス3体、エーフィ2体、フーディン1体、ゴローニャ1体、カイリュー3体…その他ゲンガーやラプラスなど挙げだすとキリがない。砂がいくらあっても足りない。一日が終わってみれば殘ってる砂は3ケタほどだ。
砂集めがもう大変。
てことで、今日は地元の水元公園を2時間、1万歩ほど徘徊してポケモン狩りをしてきた。
68匹捕獲して、そのうち3匹が青リーダーの評価が「驚異的、芸術的」個体。砂5000(レベル29か30)のミニリュウがそのうちの一匹で即戦力を捕獲できたのが今日唯一の収穫…って、これ以上砂を投入する対象を増やすのは無理なのでしばらく塩漬かなあ。
68匹捕獲→砂6800に、卵孵化の砂も合わせると砂が14000ぐらいになったけど、上記したように1体強化するのに砂が5000以上必要だったりするんで、あっという間。2体強化したら終了。
砂に関しては効率の良い集めかたはなくて
・ポケモンを捕獲する
・卵を孵化させる
・自チームのジムに木の実を配る
この3つを地味地道にやるだけ。歩きまわるだけ。
まだ暑さが酷いけど、これから涼しくなってきたらちょっとはラクになるかなあ。
メタボ解消のウォーキングを兼ねてるんで、歩くのがいいと思いつつ、大人用キックボードなんてのを検索する怠惰な無職初老フリーターだ。
今日収穫のポケモン68匹。
2ページ以降もポッポコラッタパラスコイキングオタチイトマルなんかがぞろぞろ並ぶ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
物書きの執筆道具

テキストでいただけると助かります、ということで、WORDの.docファイルをいただいて、あ、えーと別名保存でですね、ということが1度や2度じゃなくあったりなかったりするし、WEBの表示が妙なので管理ページのソースを確認したらどうやらWORDの文書をコピーして管理ページのビジュアルエディタにペーストしてたり、WORDで書いた小説やエッセイをEPUBにしたいんですけど、という問い合わせはそれこそざらにあるし。
ああ、世間一般、やっぱMSのくそビジネスソフトに使われてるんだなあ、とtwitterにぼんやり書きこんだら。
んなこたぁねえよ、ワードなんぞ使わんよ、たこ。というレスをいただいた。
みなさん、商業作家さんだったり同人作家さんだったり、物書きのかたがた。速攻でレスがついたのは、やはり書き物の道具に関してはこだわりがある、ということだろう。
わたしも初めて知ったエディタなんかもあるんで、ざっくり引用、紹介してしまいます。
ツイートの引用はやめてくれ、ということでしたら遠慮なく気軽におっしゃってください(@t2akii)。また、該当ツイートを削除すればこちらでは表示されなくなります(※キャッシュしてるのですぐには消えません)
(レスをいただいた順に)
野間みつねさん
使用エディタ:
「秀丸」 https://hide.maruo.co.jp/software/hidemaru.html
WEB: 「千美生の里《ちみぶのさと》」
最新刊: 『はたとせ -「千美生の里」20周年自選蒐-』
伊東麻紀さん
使用エディタ:
「秀丸」 https://hide.maruo.co.jp/software/hidemaru.html
縦書き https://hide.maruo.co.jp/software/hidemaru8/edit.html
最新刊: 『崖の上に住む女』
くまっこさん
使用エディタ:
「mi」 https://www.mimikaki.net/mi/introduction/index.html
WEB: 「くまっこにっき」
最新刊: 『綺羅星と星屑』
つむぎゆうさん
使用エディタ:
「OS-Editor」 https://ospage.jp/soft/oseditor2/oseditor2.html
縦書きなどスタイル https://ospage.jp/soft/oseditor2/oseditor2style.html
WEB: 「懐中天幕 楽屋」
最新刊: 『TOKYO SWEET ROOMS(1)』
猫春(にゃんばる)さん
使用エディタ:
「terapad」 https://www5f.biglobe.ne.jp/~t-susumu/
「iText」 https://www.jp-lightway.com/iText.html
WEB: 「ばるけん」
最新刊: 『クッキー・トラベラー』
犬吠埼一介さん
使用エディタ:
「VerticalEditor」 https://kumacrow.blog111.fc2.com/blog-entry-733.html
WEB: 「犬吠崎一介のホームページ」
最新刊: 『割られよ凍てついた王冠よ』
みなさん縦書きのできるものを利用してるんですね(miは縦書きはできないですが、インデザ直打ちという無茶なことをしてるということなので、縦書き認定)
それにどうやらカスタマイズして使っている様子。
「手に馴染ませることができる」のはポイントですねえ。脳内から文字に直結させるためには必須でしょうか。
つけくわえると[08/25 09:54:24]
物書きとしてのキャリアは10年以上、20年以上といったひとたちが辿りついた、使い続けている道具(エディタ)
それだけ、上記したエディタは使い勝手など信用できると思います。
これでは、あまりにワードの立場がなさすぎなので、最後にたぶん世間一般
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
停滞中

電子書籍アプリを app storeにとりあえず公開したものの、文字の滲み・ボケがあったので修正して、再度審査申請中。一週間経ってもまだ絶賛放置プレイ中。今の状態でHappyReadingにバナーをつけたり、twitterなどで告知しても「わ、読みにく!」と思われるので、人通りの少ないこの雑記帖で告知してるだけ。次の収録作品も準備中で、文字のボケを直したものが公開されたら、またすぐに作品を追加して審査申請する予定。
にしてもなあ。年会費を取られてるわけで、審査に10日もかかったひにゃ、文字通り無駄に時間が費やされてしまう。OSのバージョンアップや、新iPhoneなどでリソースが割かれて大変なんだろうけど、もう少しスピーディにやってもらいたい、うううむ。
そういや。いつの時代も同じことの繰り返しには違いないだろうけど。
twitterなどを見ていて唖然としたのが。自分たちで本を作れば粗利が!とか個人で本を作って出せばすばらしい!とか、今、まさに今これが新しい!という記事。おいおい、そんなもの、同人誌じゃ30年以上も前からやってることだぜ、と呆れてしまう。ちょっと調べればわかること。従来の同人誌と今その新しいものが、どこが違っていて、ここが新しい、というのなら面白い・参考になる記事、ツィートにもなるだろうけど、ただただ、語彙貧困、凄いとしか言ってない。薄っぺらで、ただの周回遅れをゲームの先頭ランナーとして持ち上げている。それでキュレーターとかアルファブロガーというらしい。恥ずかしくないのかねえ。
んなこんなで、この一週間は請負仕事の打ち合わせをして、そのための資料を漁ったりしただけで、実際に生産的なことをしてないよなあ。どんなことでも、なにかカタチにしていないと焦燥感にかられる小心者だ、おれ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
満腹のタコ焼き

ふと思いついて、今日はウチでたこ焼き。うまく作れるのか、不安をかかえつつ、とりあえず不恰好でも食えるシロモノにできあがる。ヨメとふたりでふーふーいいながら食い、ふたりともタコ焼きで満腹になった。タコが美味いし、小エビ、揚げ玉、紅しょうがとの相性も抜群で、たこ焼きを考えたひとはエライ、としみじみつくづく。いや、本当に美味かった。こういうのもシアワセというのかもしれんなあ。 FED2 Industar-26M CENTURIA 200
土曜に行った麻布十番納涼祭り。街全体が祭りで舞い上がっている中、ひっそり営業中の喫茶店だかレストランだか。天井が低くて年代モノの建物だった。六本木なんてのが近いせいで、バブリーでチャラいイメージがあったけど、麻布十番そのものは古い街、らしい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」