片仮名と正規表現

| コメント(0) | トラックバック(0)

あるウェブサイトで、文字列が片仮名かどうかを判定する正規表現として /^[ァ-ヶ]+$/ のようにしているのを見て、あれれと思いました。(「ヶ」はそもそも片仮名かという問題はありますが、それはここでは除外)

分かってやっているのならいいですが、これでは長音の「ー」が含まれません。JIS順でもUnicode順でも、「ー」はこの範囲に含まれません。JIS X 0208/0213では、片仮名が5区にあるのに対し「ー」は1区28点にあります。Unicodeでは、「ァ」がU+30A1、「ヶ」がU+30F6なのに対して「ー」はU+30FCですから上記の範囲に含まれません。Unicodeの場合は連続したKatakanaブロックの中にあるので、例えば [ァ-ヾ] (ここで「ヾ」はU+30FE)とすると「ー」も含まれることになります(この場合は中点「・」も含むことになります。それが適当かどうかは用途次第)。

もっというと、Unicodeの場合、濁点・半濁点に結合文字を使うと、上のやり方ではマッチしなくなります。「ザ」を表すのに単一の符号位置U+30B6でなく、「サ」U+30B5と合成用濁点の連続を用いていたというケースです。合成用濁点はU+3099、合成用半濁点はU+309Aと、Hiraganaブロックにあるためです。結合文字なんて使わないと思われるかもしれませんが、どこかからコピペして入力したときに、コピペ元がたまたまNFDで正規化されていたなんていうことはあり得ることです。

さらに、上の正規表現では、JIS X 0213で追加されたアイヌ語表記用の片仮名も外れています。アイヌ語なんて使わないと思われるかもしれませんが、用途としては別段アイヌ語に限定されてはいません。以前書いたように(「JIS X 0213の小書きの仮名」)、韓国語の発音を片仮名で表すのにもある程度使えますし、また例えばイタリア語のCampanellaという名前を「カㇺパネㇽラ」と書くことも考えられなくはありません。この「ㇺ」「ㇽ」などは、UnicodeではU+31F0からU+31FFのKatakana Phonetic Extensionsにあり、コード範囲は基本的な片仮名と連続していません。

どこかのサイトに書いてあったことを鵜呑みにするのでなく、用途や状況に応じて詳しく検討する必要があります。

トラックバック(0)

トラックバックURL: http://yanok.net/yanok/mt-tb.cgi/387

コメントする

最近のブログ記事

仮名合字・合略仮名の文字コード
合字とは 合字というものがあります。複数…
なぜ『プログラマのための文字コード技術入門』の改訂新版にはSKKと Emacsの話が入っていないのか
拙著『[改訂新版] プログラマのための文…
朝鮮半島の訃報の第3水準漢字
朝鮮戦争で韓国軍として活躍した白善燁氏が…
テレワークの環境改善〜CO2濃度をチェックする
テレワークの問題点 新型コロナウイルスの…
エンジニアHubにて「文字コード再入門─ Unicodeでのサロゲートペア、結合文字、正規化、書記素クラスタを理解しよう!」公開
「エンジニアHub」にて記事を執筆しまし…

広告