ブログトップ 記事一覧 ログイン 無料ブログ開設

ちくちく日記 このページをアンテナに追加 RSSフィード Twitter

2012-06-08

InDesignの正規表現検索置換で文字化け

なんかこういうネタって、もう詳しい人(大石さんとかせうぞーさんとか)がとっくにやってるような気がしなくもないのだけど、気がついたからメモ。


フォントが持っている文字(キャラクタ)のなかには、文字コードがふられておらず、CIDのみを持つ文字というのがある。

たとえば、モリサワ A-OTF 新ゴ Proでの丸数字㉑以降。

f:id:akane_neko:20120608181258j:image

▲CIDはあるけど、文字コードはふられていない

ちなみに、モリサワのProフォントでは丸数字に関して、Unicode3.2に準拠したPr5以降では㉑以降の文字にもコードがふられているが、3.0準拠のProでは降られていない。(参考:なんでやねんDTP 丸数字とユニコード

こういう、文字コードを持たない文字がある状態で、InDesignの正規表現検索置換を書けてみる。

ここでは、検索文字列に (.) 、置換文字列に $1★ とした。

(.)で、文字1文字を検索し、 $1★でそのマッチした文字($1)の後に★を入れる、つまりすべての文字の後に★を入れるという置換。

f:id:akane_neko:20120608181259j:image

▲文字の後に★を入れる、という正規表現置換

期待する結果としては

f:id:akane_neko:20120608181300j:image

▲こうなるはず。

ところがこれを実行すると。

f:id:akane_neko:20120608181307j:image

▲こうなります。

CIDしかもたない文字(キャラクタ)に正規表現検索置換をかけると文字化けする。

多分、InDesignは正規表現の置換で、マッチした文字の文字コードを($1)の中に保持してるのだけど、その文字コードがない文字なので、うまくいかないのだと思う。



ところでこの文字列のフォントA-OTF 新ゴ ProをA-OTF 新ゴ Pr5に変更するとどうなるか。

f:id:akane_neko:20120608181309j:image

▲書体変更 新ゴ Pro→新ゴ Pr5

書体変更した文字列を字形パレットでみてみると、Pr5では㉑以降の丸数字にもちゃんとコードがふられているので、字形パレット上で、文字コードをもつ文字として認識されている

f:id:akane_neko:20120608181303j:image

▲Unicodeが指定されている。

が、同じように正規表現置換を欠けると

あれっ、化けた!

f:id:akane_neko:20120608181307j:image

▲文字化けしてしまった

ためしに今度は㉑から㉖まで新ゴ Pr5で打ち直したテキストで置換してみる

今度は正常に置換された。

f:id:akane_neko:20120608181304j:image

▲正しく置換。


ついでに、この文字をそれぞれテキストエディタにペーストしてみよう。

f:id:akane_neko:20120608181305j:image

▲InDesign上で打ち込んだ文字

f:id:akane_neko:20120608181306j:image

▲テキストエディタ(mi)にペースト


みてのとおり、新ゴProで打ち込んだCIDしか持たない文字は「1A」という文字に化けています。これはInDesign内部で独自の文字に変換させているのだと考えられます。

さらに、新ゴProで打った文字列を新ゴPro5に置き換えた物も、「1A」表示です。これも考えてみれば当たり前の話で、書体を変更したからといって、文字(キャラクタ)そのものが変わるはずがない。だから、当然他のアプリケーションにコピペすれば「1A」表示です。

だけど不思議なのは、文字コードのない文字が指定されているにも関わらず、字形パレットでは違う文字情報が表示される不思議!

f:id:akane_neko:20120608181303j:image

▲Unicodeが指定されてるという表示なの…

字形パレット上ではUnicode3251が表示されてたけど、実際は文字コードのない文字が入力されている。

うん、ややこしくなってきたね!

つまりInDesignは、Pro→Pr5にフォントが変更になったとき、自動的にCIDが一致する字形に置き換えてくれたんだね。でもそれはあくまで字形だけの問題なので、文字コードまで置き換えたわけではない。で、本来なら字形パレットでは、CIDをもっていて、文字コードがないという状態表示が適切だと思うのだけど、字形パレットではこの文字はユニコードを持つ文字として表示されている。

と、いうか字形パレットって別に今選択している文字キャラクタが表示されているという訳ではないんだな。

多分字形パレットは、そのフォントのCIDから情報を引っ張ってそれを表示しているだけで、選択している文字の文字コードを表示しているわけではない。

なので、こういう食い違いが生じるのだと思う。


と、いうことで、注意点二つ

■字形パレットの文字コード表示は必ずしも正しいとは限らない。

■正規表現検索置換をかけるときは、必ず置換された箇所を確認しないと、思わぬ文字化けが生じている可能性がある。


まぁ、字形パレットでの表示についてはビミョーな話すぎて、修正してよというほどのものではないけど、正規表現の方はヤバすぎんだろ。置換できないならともかく文字化けさせてくれるのはしゃれにならない。


多分InDesignの正規表現検索置換ではCIDしか持たない文字があるなんていう日本語特有の事例までは想定していないのだと思う。マイナー言語の悲しさですな。

と、いうことで、日本語で正規表現検索置換をするときは、思わぬ文字化けを避けるため、置換した箇所を全部くまなくチェックしましょう。

それなら始めからこの機能使わず、ひとつひとつ手作業変換したほうがいいかもねっ☆

なかなか 2012/06/11 12:04 はじめまして。
丸付ひらがななんかは,同様の正規表現検索置換を行うと,
“○あ”が“あ”に変わってしまったりするので,すでに組んだものを修正する段階では一括置換はできないな,と思っていました。
“○あ”はUnicodeも持つのですが,今回の丸付数字の事例とはまた違った仕組みで起こっているのでしょうか。
よく調べず,aaltやnaltの属性を持っているからかな,と想像していました・・・。
aaltやnaltは何となく問題が多いイメージがありまして・・・。

akane_nekoakane_neko 2012/06/11 15:02 なかさん、こんにちは。

>>“○あ”はUnicodeも持つのですが

“○あ”がもつUnicodeは“あ“と同じ3042(つまり同じ文字)で、○付きの修飾はあくまでInDesign上の字体きりかえで表現されてますね。

○数字の方は、Pr5以降の○数字は①(unicode2460)と1(unicode0031)では違うUnicodeが割り当てられてます(つまり別の文字)

なので、検索置換での動作も変わってくるのだと思います。
でも確かに検索して(置換せずに)マッチさせるだけで○付きみたいなnalt情報が外れちゃうのはおかしな動作だなぁ…とは思います。

なかなか 2012/06/12 10:47 お返事ありがとうございます。
○付きひらがなの方は単純に,naltやaaltの情報が外れてしまうということなのですね。
こちらとしては,その情報も含めて$1のつもりだったのに・・・と,ちょっと残念です。
○数字の件も含めて気をつけます・・・。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証