InDesign Glee の CS5 対応

InDesign Glee を CS5 に対応させられるかどうか確認するために、Adobeの本家サイトから英語版の体験版をダウンロードしてみました。インストールして分かったことは、

.indd のファイルタイプがちゃんと「IDd7」になっていた

これで「バージョン別のアイコン表示」は問題なしです。ホッとしました。

.indd のバージョン情報取得は CS4 と同じ方法で大丈夫だった

コードをいじらなくていいんです。ビルドもしないで、アイコンファイルを追加して、Info.plist を書き替えるだけで CS5 対応完了。ラクチンすぎ。

でもひとつだけ困ったことが…

IDML のバージョン取得はどうする?

.idml は、見た目は普通のファイルのようですが、実際はZIP圧縮されたアーカイブファイルです。解凍してみると複数の XML にバージョン情報があります。
どのファイルを参照したらいいの?
そもそもバージョンを取得する必要があるのかどうかも分かんないです。
どうしようかなあ、これ…

文字コードはなぜ複雑になるのか

プログラマのための文字コード技術入門 の第1章に「文字コードはなぜ複雑になるのか」という節があります。そこには「過去の経験の積み重ね」「文字そのものの難しさ」の2つが挙げられています。もちろんその通りなのですが、私が常々感じている「もうひとつの文字コードの複雑さ」があるのでメモしておきます。
続きを読む →

Unicodeで「漢字」の正規表現

改訂:2017/07/22
Unicode 10.0に合わせて書き直し。正規表現を簡易にしようとしてやりすぎていたのを修正。

改訂:2023/03/21
U+30000以降を追加。InDesignの正規表現を追記。


正規表現で漢字の範囲指定をする場合、Unicodeではどうするかが悩ましいところです。

Unicodeの漢字の範囲として [一-龠] にしている例を見かけます。しかしこれは旧規格JIS X 0208の漢字が含まれる範囲をUnicodeの中から切り出しているだけです。互換漢字ブロックをまるごと取りこぼしているので、WindowsのシフトJIS(CP932)の拡張漢字に当たるものが含まれていません。現規格JIS X 0213の第3・第4水準漢字も考慮されていません。簡易な範囲指定だとしても、新常用漢字の「𠮟」が含まれておらず、今から見るとあまりに時代遅れです。

Unicodeのすべての漢字の正規表現 その1

環境によってはUnicodeスクリプトの \p{Han} が使えます。対応するコードポイントの一覧はこちらで確認できます。
※リンク先はUnicodeの最新のバージョンではない場合があるので注意してください。
UnicodeSet で \p{Han} の対応コードポイント一覧を表示

Unicodeのすべての漢字の正規表現 その2

\p{Han} が使えない環境は普通にあります。使えたとしてもUnicodeの最新バージョンに対応しているとは限りません。しっかりマッチさせたい場合は、範囲指定をするしかありません。その際、漢字はUnicodeの中であちこちに分散しているので、シンプルな範囲指定は不可能です。

Unicodeの漢字の内訳は以下になります。

※コードポイントの範囲は未定義箇所を含めています。\p{Han} に含まれるハングルの数字(12文字)は除外しています。Unicodeのバージョンが上がっても対応できるようにBMP外はU+2FFFFまで含めています。

2E80..2FDF CJK部首補助+康熙部首
3005 々(漢字の踊り字)
3007 〇(漢数字のゼロ)
303B 〻(漢字の踊り字)
3400..4DBF CJK統合漢字拡張A
4E00..9FFF CJK統合漢字
F900..FAFF CJK互換漢字
20000..3FFFF CJK統合漢字拡張B〜G+CJK互換漢字補助+CJK統合漢字拡張H+念のためU+3FFFFまで

これをまとめると、下記になります。いかがでしょうか。

[\x{2E80}-\x{2FDF}々〇〻\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{3FFFF}]

InDesign CS3~2023(18.1)

InDesignの漢字のワイルドカード「~K」は使いものにならないので、上記の正規表現を使った方がいいでしょう。

InDesign 2023(18.2)~

「~K」が改善されたので、短くできます
[\x{2E80}-\x{2FDF}々〇〻~K\x{30000}-\x{3FFFF}]

Unicodeの特殊な文字 “結合文字列”

2024.5.18更新


まともに Unicode のテキストを扱おうとすると、結合文字列はどうしても避けることのできない問題です。ここではあまり深く掘り下げずに、ユーザの眼を通してこれを見ていこうと思います。

まずはじめに、Unicodeには「特殊な文字」があることを知っておきましょう。

上図を見てください。これは macOS のテキストエディットに入力した2つの「ポ」です。同じ文字が並んでいるだけのように見えます。でも実はこの2つ、文字データとしてはまったく違うものなんです。

左はいつも私たちが使っている1文字の「ポ」ですが、右は「ホ+半濁点」の2文字のデータで1文字になっています。これが Unicode の特殊な文字 “結合文字列” です。見た目が同じなので違いがまったく分かりません。

そこで違いが分かるように簡単なソフトを作ってみました。
Unicode Normalization Test
macOS 10.14(Mojave)以降

左に「ポ」と手入力して NFD ボタンを押してください。右に Unicode の特殊な文字に変換されたポが表示されます。下の文字コードを見ると「ホ」と「半濁点」の2つに分かれています。「2文字のデータで1文字になっている」とはこういうことです。

さらに興味深い文字を見てみましょう。

[Get Character]ボタンの下に「01D6」と文字コードを入力し、ボタンを押します。上にその文字が表示されます。小文字 u に音声記号が付いた文字ですね。[NFD]ボタンを押して変換してみます。なんと、2文字ではなく3文字で構成されていることが分かります。

次に[Get Character]ボタンの下に2組の文字コード「00FC 0304」を入力してボタンを押します(半角スペースを間に入れます)。まったく同じ字形が表示されますね。

つまり、この文字は3通りの方法で表示できてしまうのです。

  • 01D6
  • 00FC 0304
  • 0075 0308 0304

この3通りの文字を「テキストエディット」にコピー&ペーストしてみましょう。

テキストエディットでは、どの文字も1文字として選択されます。さらに検索をしてみると、どの文字にもヒットします。3つが異なる文字データであることをまったく判別することができませんし、判別する方法もありません。もちろんこれはユーザへの配慮でそうなっているわけです。

さて、ここで専門用語を2つだけ覚えてください。

「結合」「結合文字列」

これまで見てきたように、Unicodeには「複数の文字で1つの文字を表示させる」という特殊な方法が用意されています。この方法を「結合(Combining)」といいます。平易な言葉なのでつい読み流してしまいますが、Unicodeでは特殊な専門用語であることに注意してください。

そして、結合した複数文字のことを「結合文字列(Combining Character Sequence)」といいます。見た目は1文字ですが、実際は複数文字なので「列」です。

Unicodeでは「ポ」などの文字を「音声記号がくっついた文字」と考えます。「音声記号の半濁点がくっついたホ」と見るわけですね。これを文字の形だけでなく、本当に文字データでも「音声記号がくっついた文字」にしたのが結合文字列です。

なお、これは覚えなくてもかまいませんが、結合文字列の中の音声記号(半濁点など)は「結合文字(Combining Character)」といいます。これは結合文字列のためだけに用意された特殊な文字なので、単独で使われることはありませんし、単独で使ってもいけません。そして結合文字列「ホ+半濁点」の「ホ」の方は「基底文字(Base Character)」と呼びます。

macOSは結合文字列だらけ

さて、Unicodeの特殊な文字である「結合文字列」がどういうものかを見てきましたが、もしかすると、皆さんはこう疑問に思っているかもしれませんね。

「特殊な文字のことは分かった。でも、特殊なんだから、普通に作るテキストデータにそんな文字なんか無いのでは?」

実は、macOS には “結合文字列” がいたるところにあるのです。しかも、新しく簡単に作ることもできてしまいます。やってみましょう。

新規でフォルダを作ってください。「名称未設定フォルダ」という名前になりましたね。なんと、この名前の「ダ」が結合文字列なのです。「ダ」を「簡単なソフト」へコピー&ペーストしてみてください。2文字の結合文字列だと分かります。

macOS のフォルダやファイルなどの名称は、手入力をした場合でも、自動的に結合文字列にできる文字すべてが結合文字列に変換されます。ですから、名称をテキストにコピー&ペーストするだけで特殊な文字が混ざってしまうのです。

プログラマのための文字コード技術入門

文字符号化ブログに「自分のサイトに引っ越すことにしました」と書かれていたのでリンクをクリックしたところ、著書が掲載されていたので早速購入しました。

プログラマのための文字コード技術入門

文字コード関連の知識は、必要になった時点でそのつど行き当たりばったりに調べるのでかなりムラのある知識になってしまうのが普通です。そのムラをフラットにする技術解説書として、この本は非常に優れていると思いました。私自身の知識も相当すき間だらけでスカスカじゃんか! ということもしっかり確認できましたよ。

私が驚いたのは、紹介ページにあるこぼれ話でした。

また、Unicodeの正規化で置き換わってしまう互換漢字についても、編集者の手持ちのソフトウェアで問題のあるものがあったようです。確認のために「これでいいですか」といって送られてきたデータを見たら、ものの見事に互換漢字が統合漢字に置き換わってしまっていてびっくりしました。

Mac版InDesignでコピペしたのでしょうか…。怖い話です。(1

  1. Fill InDesign で解決したのなら嬉しいんですけどね〜 []