ひまつぶし雑記帖

perlで扱うutf8フラグやutf-8-macの小ネタ

2014/1/12 [17:40:36] (日) 天気

perlのスクリプトでmacの日本語ファイル名がマッチしない、という話題がtwitterに上がっていた。ネタ的に面白そうなので自分でも試してみたところ、macの日本語ファイル名が正規表現で一致しないことに気づいて、ちょっと吃驚。

フォルダには
・test.txt
・あいうえお
・ペダル
・memo.txt
など、アルファベットのファイルや日本語ファイル・フォルダが雑多に入っている。
この中から「あいうえお」と「ペダル」だけを検索で引っ張り出したい。というのが以下のスクリプト。

ところが、これでヒットするのは「あいうえお」だけで、「ペダル」はヒットしない。

twitterでの流れを追うとどうやらmacのファイルシステムが(日本語ファイル名に)使うのは NFD という形式らしい(Normalization Form Canonical Decomposition)。これをperlで判定するためには NFC という形式に変換してやる必要がある(Normalization Form Canonical Composition)

NFDとNFCで問題になるのが。
・濁音などがはいると文字コードが違ってくる。
・macの場合はさらに一般的なNFDではなくて、utf-8-mac というちょっと特殊なもの。

『Geekのメモ: Mac OS Xのファイルシステムの文字コード』
↑こちらのページが具体的でわかりやすかった(感謝!)

お馴染みの Data::Dumper で読み込んだファイル名と、スクリプト内の文字を比べると、文字コードが違っていた。まさに上記した utf-8-mac の問題。「あいうえお」は濁音が混じってないので文字コードは同じだけど、「ペダル」は濁音部分で文字コードが違っていた・文字長が増えていた。

上記サイトを参考に、CPANから Text::Iconv をダウンロード、インストールしてテストスクリプト。
1)ファイル名を utf-8-mac から、utf-8に変換する。
2)変換したファイル名にutf8フラグをつける。

↑で、無事確認できた。



ついでに。utf8フラグのおさらい。

文字コードのutf8とperl のutf8フラグは別モノ。

perlがスクリプトで内部処理するのにつけるのがutf8フラグということ…って、素人のわたしはよくわかってないので検証。

コマンドラインで引数に渡したファイルを読み込んで、「弱虫ペダル」を含んだ行を出力(プリント)するだけの単純なスクリプト。

・スクリプト自体は文字コード、utf8で書かれている。
・「弱虫ペダル」は文字コードがutf8で、 use utf8 によって、perl の utf8フラグがついている。
・最初の if 文は、utf8フラグのついていないテキストと、utf8フラグのついた「弱虫ペダル」の比較なのでヒットしない。
・Encode::decode で読み込んだファイルのテキストにutf8フラグをつける。
 ENCODE-NAMEはファイルの文字コード。shiftjis、 utf8など。
・次の if 文は utf8フラグのついているテキストと、utf8フラグのついた「弱虫ペダル」の比較なので文字コードが * shiftjisだろうがutf8だろうが * ヒットする。

・スクリプトの文字コードはutf8でも、use utf8をつけない場合(スクリプトにutf8フラグがつかない場合)
・「弱虫ペダル」は文字コードがutf8で、perl の utf8フラグはついていない。
・最初の if 文では入力ファイルの文字コードが utf8 のものだけがヒットする。
・Encode::decode で読み込んだファイルのテキストに utf8 フラグをつける。
・次の if 文は utf8 フラグがついているテキストと、utf8フラグのついていない「弱虫ペダル」の比較なのでどれもヒットしない。

perl の utf8 フラグをつけることによって、スクリプトや、入力されるテキストの文字コードは何でも構わない、という超便利なフラグ(decodeで正しい文字コードを指定する必要はあるけど)

perlのutf8フラグネタでは以前  「utf8移行と自分メモその2」  こっちにも覚え書き(utf8フラグをつけたスクリプトは、変数に日本語が使える、というネタはこちら)

encodeネタでは変換に失敗する文字をチェックするのにencodeの第3引数に、というネタも  「メモ encodeで変換失敗を第三引数でフォロー」  …ほんと、なんちゅーかほんちゅーか。面倒くさい。



話の発端からtwitterを追ってみると、utf16だったことが原因だったということでした。
て、utf16使う状況があるのか!?参考になります。ううううむ。難物。

»電子書籍制作代行についてはこちら

めも:Windows7でunixコマンド他

2013/5/26 [06:57:30] (日) 天気

unixのコマンドをWINDOWSでも使いたくて、10年以上前はCygwinをWINDOWSにインストールして使っていた。当時はFreeBSDを普段使っていて、仕事でWINDOWSやMac。

仕事の方でもホームページ(当時はWEBサイトではなくホームページ)を立ち上げたり、進行管理のためのCGIを作るようになってActive perlをインストール。となるとコマンドラインでいつものように cp ls grep diffなんてのを叩いてしまう。そのたびに見つからないと叱られるので、Cygwinをインストールして使うようになった。

で、今。普段使うMac OSXはもともとBSDで、unixのコマンドがそのままある。rubyやapacheまである。FreeBSDのGUI環境の X がたまたま Mac になっただけ。

請負仕事の電子書籍制作。
現状では、元のテキストやワードに合わせて、perlの使い捨てスクリプトを書き散らかしている。現物合わせのやっつけ仕事で、Mac OSX のターミナルでコマンドをガシガシ叩いている。

たとえば制作途中のものをWINDOWS7のネットブックに移して続けるにはunixのコマンドが必要になる。非力なネットブックにCygwinはつらいなぁと思ってたところ、unixの主要コマンドを使えるようにしたGOWというプロジェクトがあった。

https://github.com/bmatzelle/gow/wiki

awk ls cp vim grep zip bash など普段使いのコマンドが一通り入っていて大助かり。多謝。
これでネットブックのコマンドラインがストレスなく使えるし、使い捨てスクリプトから使うcp などのコマンド表記をそのままでOKなのでいちいちWINDOWS用に書き換える手間がなくなった。


*****


ワードの .docx ファイルから取り出したdocument.xmlを読むのに重宝しているperl の Data::Dumper 
便利なんだけど、日本語(ユニコードの文字)が文字化け(ではなく、16進数表記)になって出力されるので読めない。気になる該当箇所がどこなのかぱっと見ただけではわからない。
(ord(あ) → 文字コードにして → sprintf %x → 文字コードを16進数にしているらしい)

前から困ってたんだけど、なんとなくその場その場で解決したので放置。
ここにきてWORDの文書をEPUB3にすることが増えてきたので、さすがに検索した…ら、みな困っているのかスグにヒット。

ふたつ方法があるらしく、まずは自分のわかりやすい方を採用。


いろいろ。ちょっと快適。image 

»電子書籍制作代行についてはこちら

CSSとperlの小ネタめも

2013/5/8 [11:22:31] (水) 天気

電子書籍がらみ。HTMLとCSSでどうやって表示・表現すればいいんだろうと調べたことをメモしておこう。

【横書き】

1M(1メガバイトは)は、2の20乗バイト(220 = 1048576バイト)です。


この文字の右肩に小さくついてる「20」ってどうすんだ、画像にしてくれなきゃ無理だろ、と思わず担当者にメールしようとして思いとどまった。調べた。

右肩に小さくつけたい文字をspanタグで囲み、spanタグにスタイル指定

フォントサイズを小さくして、下側のpaddingを0にして、表示の基準ラインをトップにする
(padding-bottom は指定しなくて大丈夫っぽいけど…どうして指定してあったんだろう)


【縦書き】

縦中横をperlで一括処理する。

単純に、すべての半角アルファベットに縦中横のタグをつけるのは簡単な正規表現。
このあたりに →  『ルビのため perl unicode正規表現』

縦書きなのにやたら英単語が混じると、単語の長さによって縦中横になったりならなかったり、とても読みにくい。ということで、アルファベットの縦中横について

・アルファベット一文字は縦中横にする
・英単語は縦中横にしない

英単語をとりあえず別形式にエンコードして保護しておく。
「tab+アルファベットの10進数」
タブだったら原稿に混じり込む可能性は少ない。タブ+数字というのはまず出てこないだろう。

一文字のアルファベットに縦中横を定義したクラスを指定。

タブ+10進数にしておいたアルファベットの英単語を元に戻す

(上記、正規表現のところをいじれば、アルファベット2文字までは縦中横にする、3文字以上の単語はそのままにする、なんてことも出来る。でも、中途半端な設定は読みにくくなるだけ)

ていうか、そもそも、アルファベットの英単語や数字が入り乱れる「実用書」なんて縦書きである必要は感じない。底本が縦書きであっても、電書にする時には横書きで十分。縦書きの底本は全角半角アルファベットがその時々で別々。正直とても読みにくい。小説でもないのになんでまた縦書きにしたんだろう。謎だ。

»電子書籍制作代行についてはこちら

WORD文書をEPUB3に変換

2013/4/5 [11:47:36] (金) 天気

文書ファイルを電子書籍のEPUB3ファイルにコンバートするケース。元ネタになる文書は、サイト用に作られたHTML文書だけではなくて、当然WORD文書もある。

って、わたしはプログラマではないので、アプリが出力するバイナリデータを直接触ってごにょごにょするのは無理。

「テキストデータに変換したものをもらえば対応できますのでゼヒゼヒ」と営業してきたけど、先方はライターから上がってくるWORD文書をそのままEPUB3にして欲しいに決まってるしなあ。と。

調べてみたら、最新バージョンのWORDで保存する、拡張子が .docx の文書はzipで固められたものらしい。unzipで解凍したものが以下。
image 
xmlで保存されていて吃驚。
全部きちんと調べてないんだけど、どうやら「document.xml」が本文。これならAWSのAPIと同じ。XMLなら中身を見ることができるので、ざっくり文章を抽出することはできた。
perl の定番、 XML::Simple と Data::Dumper でデータを眺めると、位置情報やフォントサイズなどの属性も入ってるっぽい。画像も同様。WORD文書に見出しタイトルなどがついていれば、それを目次に登録してEPUB3文書にできる。

とはいえ、やはり検索してみるとすでにWORD文書をEPUB電子書籍に変換=コンバートするアプリは無料有料があるし、一太郎のEPUB3出力エンジンは定評のあるFUSEeなのでWORD文書を一太郎に読み込んでコンバートというやりかたもある。たぶん凝ったレイアウトなどもうまく再現できる、はず。

わたしが作るとしたら、大量にあるWORD文書をひとつひとつソフトに読み込んで、ひとつひとつ出力していく手作業よりも、WORD文書が入ってるフォルダをボトっとドロップしたらそれっぽいEPUB3文書にする。という大雑把なシロモノになるんだろうなあ。
スクリプトは手順どおりのことをさせるだけなので、面倒くさいけど難しいことはない。必要に迫られたら作ってみよう(本当だったらXMLの公式の仕様書を見ないとメンテができないけど。ね)

XMLってこんなところに使われてたのか。



[04/05 20:28:06] 追記。
ということで  『かんたん電子書籍作成』  に組み込んでみた。
ワードのファイル(.docxなので2010以降かな)をそのままアップロードできるように。ただ、レイアウトやフォントなどのデザイン情報は無視します。挿絵があったら、ダミーの画像を一枚差し込むようにしてみました。
ちなみに、ルビはワードそのまま大丈夫。縦中横もそれっぽいところは自動で指定しています。
(つむぎゆう・『わたし、おねえちゃんの犬になる』より)
image 


[2014/02/14 14:25:34]
こちら、 『かんたんEPUB3作成easy_epub』  にもWORDの文書を流し込んでEPUB3にする機能を追加。縦書き・横書き、ルビ、縦中横はワードの情報を生かします。


いつも何かとふぁっくなMSだけど、XMLで保存はイカしてるぞ!

 

»電子書籍制作代行についてはこちら

ルビのため perl unicode正規表現

2013/2/22 [09:13:24] (金) 天気

EPUB3::かんたん電子書籍作成 http://books.doncha.net/epub/ では、テキストデータにルビや縦中横のHTMLタグを自動で振るためのオプションを用意してある(※ ページ中ほどにある [スクリーンショット、ルビや縦中横タグを挿入するにはこちら] のリンク)

そのための perl の正規表現メモ。

縦中横。
半角の、「!?」「!!」「?!」と、連続するアルファベット、連続する数字に span タグで縦中横のクラス tcy をつける。


ルビ。
「漢字(るび) 」と漢字に続いて半角のカッコに囲まれたひらがな・カタカナをルビとして ruby rt タグをつける。
※ WORDのルビつき文書をテキストで出力すると半角カッコの中にルビが入る


縦中横のタグはけっこうよく使う正規表現なのですんなり。でもルビのための漢字判定がちょっとわからずグーグル様。perlは5.8以降、ユニコードによる正規表現が使えるようになって、文字クラスを下記のように指定することができる。



ルビもこれを使って正規表現。でも、スクリプトでは、どこからルビなのか判断できない。東京都千代田区(ちよだく)と書いてあったら、「千代田区」ではなく「東京都千代田区」に「ちよだく」のルビがつく。「千代田区」にルビですよということで「東京都[#ルビ]千代田区(千代田区)」などとテキストにマークアップする必要がある。

「EPUB3::かんたん電子書籍作成」  のコンセプトは
「何も考えずにテキストを放り込んだら、それっぽい電子書籍ができる」

面倒っぽく感じる・小難しそうなことは極力排除したいので、Wikiやはてなで使われるような独自記法・方言マークアップは却下とした。
レイアウトデザインを作り込みたいということであれば(字下げや文字方向一部変更など)EPUB3ファイルを解凍して直接xhtmlに対してタグをつけて、CSSを作れば可能。「かんたん電子書籍作成」で作るHTMLとCSSは、こんなでいいのかというぐらい手抜きレベルに単純なHTMLなので、編集加工がしやすい元素材でもある。

HTMLタグのついたテキストデータで小説原稿などを保存管理するのは面倒なので、元原稿はプレーンな状態にしておきたい。間違えて元データを消してしまって、HTMLタグのついたデータしか残ってない!という場合に。

テキストデータからHTMLタグを除去する正規表現


»電子書籍制作代行についてはこちら

mixi graphの日記APIで写真つき投稿

2012/7/3 [11:31:06] (火) 天気

先日mixiの日記に投稿するスクリプトを作ったんだけど(「次はmixiのgraph APIから」 http://t2aki.doncha.net/?id=1339828183)これはとりあえず本文だけの投稿で、本文をjsonにしてリクエストしている。
でも、せっかくなので、写真付きの日記も投稿できるようにしてみた。

OAuthのやりとり、access_token や refresh_token の取得などは前回の記事と同じなので、ここでは省略。
perl の lwp を使って multipart/form-data をリクエストするところのメモ。
バウンダリや、文字のエスケープなど、いろいろ考えなきゃいけないことがあって、LWP::UserAgent と HTTP::Requestだけで自作するのはよくわからんなあ、と眺めたり検索すると HTTP::Request::Common というのを使うのが定番だと。さすがperl、欲しいものはちゃんとある。感謝。

てことで

例によってこんだけでOK。
content-type も access_token も、ここで指定するとちゃんと header に入っている。

ちょっとハマったのがPOSTの書き方。対象URLに実際にリクエストするのは、いろいろなケースがあってリクエストするものが違う。リクエストを生成するところとは別、実際に対象URLにリクエストするのは一カ所にした方がコードのメンテがしやすい。
でも、リクエストを生成しようと POST URL ... を入れるとこの時点で対象URLにリクエストしてしまう。
「LWP::UserAgent の post(...) メソッドは$ua->request(POST ...) への ショートカットとして存在しています。」
ということで、POSTと書くと飛んでいってしまう。
なので、
use HTTP::Request::Common qw(POST);
と、Common の POST を使うことを指定して、POSTと書いてもリクエスト生成だけですよ、ということに。
 
写真の枚数とか画像ファイルの存在チェックなどは、ここにつけたし。
perl最高っす!

 

»電子書籍制作代行についてはこちら

profile

profile

 
doncha.net
名前:
飯田哲章
mail:
t2aki@mrh.biglobe.ne.jp
twitter:
t2akii

WEBサービス制作/電子書籍制作

検索
<<2020/9>>
  12345
6789101112
13141516171819
20212223242526
27282930

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版

[19 Page]« »
1 2 3 4 5 6 7 8 9 10

TOTAL:2892

2020 (14)
1 (2)
2 (6)
4 (1)
6 (1)
7 (2)
8 (2)
2019 (17)
1 (3)
2 (4)
3 (2)
4 (2)
5 (1)
6 (1)
8 (1)
10 (1)
12 (2)
2018 (21)
1 (3)
2 (2)
3 (2)
4 (1)
5 (1)
6 (6)
8 (1)
9 (1)
10 (2)
12 (2)
2017 (32)
1 (2)
2 (1)
4 (2)
5 (1)
6 (6)
7 (3)
8 (5)
9 (3)
10 (2)
11 (2)
12 (5)
2016 (41)
1 (5)
2 (5)
3 (2)
4 (3)
5 (4)
6 (6)
7 (2)
8 (2)
9 (3)
10 (1)
11 (4)
12 (4)
2015 (99)
1 (11)
2 (12)
3 (9)
4 (6)
5 (8)
6 (8)
7 (3)
8 (5)
9 (16)
10 (6)
11 (1)
12 (14)
2014 (112)
1 (16)
2 (5)
3 (6)
4 (12)
5 (16)
6 (19)
7 (9)
8 (6)
9 (4)
10 (8)
11 (6)
12 (5)
2013 (145)
1 (24)
2 (15)
3 (18)
4 (23)
5 (14)
6 (11)
7 (7)
8 (11)
9 (5)
10 (4)
11 (6)
12 (7)
2012 (103)
1 (1)
2 (1)
3 (4)
4 (3)
5 (7)
6 (26)
7 (17)
8 (5)
9 (8)
10 (10)
11 (11)
12 (10)
2011 (54)
1 (4)
3 (7)
4 (4)
5 (14)
6 (6)
7 (3)
8 (3)
9 (1)
10 (4)
11 (2)
12 (6)
2010 (70)
1 (12)
2 (7)
3 (6)
4 (6)
5 (3)
6 (10)
7 (6)
8 (4)
9 (3)
10 (4)
11 (3)
12 (6)
2009 (144)
1 (15)
2 (12)
3 (12)
4 (6)
5 (15)
6 (6)
7 (10)
8 (9)
9 (17)
10 (12)
11 (14)
12 (16)
2008 (148)
1 (10)
2 (6)
3 (10)
4 (11)
5 (13)
6 (10)
7 (13)
8 (19)
9 (18)
10 (12)
11 (13)
12 (13)
2007 (106)
1 (7)
2 (5)
3 (3)
4 (7)
5 (5)
6 (9)
7 (8)
8 (13)
9 (18)
10 (11)
11 (8)
12 (12)
2006 (158)
1 (28)
2 (28)
3 (25)
4 (7)
5 (9)
6 (7)
7 (12)
8 (13)
9 (10)
10 (7)
11 (6)
12 (6)
2005 (350)
1 (31)
2 (26)
3 (26)
4 (27)
5 (29)
6 (30)
7 (32)
8 (30)
9 (30)
10 (32)
11 (29)
12 (28)
2004 (292)
1 (24)
2 (24)
3 (29)
4 (27)
5 (28)
6 (25)
7 (26)
8 (24)
9 (12)
10 (19)
11 (26)
12 (28)
2003 (318)
1 (22)
2 (25)
3 (21)
4 (28)
5 (28)
6 (28)
7 (28)
8 (29)
9 (26)
10 (29)
11 (28)
12 (26)
2002 (317)
1 (29)
2 (26)
3 (26)
4 (25)
5 (28)
6 (30)
7 (27)
8 (21)
9 (25)
10 (27)
11 (28)
12 (25)
2001 (277)
1 (17)
2 (21)
3 (23)
4 (20)
5 (31)
6 (18)
7 (26)
8 (25)
9 (29)
10 (19)
11 (24)
12 (24)
2000 (53)
6 (9)
7 (4)
8 (2)
9 (3)
10 (1)
11 (15)
12 (19)
1999 (3)
7 (1)
10 (2)
1998 (18)
9 (9)
10 (7)
11 (2)