Filemaker_Tech
Filemaker_Tech
氏名 (以下 姓名) が一つの文字列として与えられたときに,姓と名を分ける必要があることは いろいろな場面で想定されます。姓と名の間には空白スペースがあるものとします。
FileMakerではLeftWords関数, RightWords関数が使えそうですが, 漢字だけの姓名では問題ないのですが,ひらがな、カタカナ, 漢字が混じる姓名 たとえば
「蘇我 うま子」, 「カナ山 奈々子」 などの場合, LeftWords関数, RightWords関数ではひらがな, カタカナ単独で抽出されて, 姓,名にうまく分けられません。
姓名の中の空白スペースを認識できればその前が姓, その後が名とに分けることができます。オリジナルのカスタム関数 Middle_Positionでは半角空白” “, 全角空白スペース” “を文字列として使えば, うまく分離することができますが, 空白スペースそのものの文字列というのは半角,全角の区別も紛らわしいものです。スマートではありません。
そこでUnicodeのコードポイントを使う方法を考えました。Unicodeは世界で使われるすべての文字に統一コードを振り付けてコンピュータで共通の文字を表示しようという趣旨で作成された文字コード体系です。Windows,Mac,Unixでも採用されています。ただ, Unicodeの策定には世界中の文字を統一コード化することに多大なる混乱があり, 現在も新しい版が更新されているようです。
** また, Unicodeの文字を符号化してデジタル文書として画面に表示する方法としてUTF-8,16,32などが策定されているわけです (と理解しています)。これは別の話になり, またまた複雑難解です (+_+)。Wikipedia 参照
そのUnicodeの文字コード体系のどの位置に目的の漢字(文字)が登録されているか,を示すものをコードポントと言います。なので, コードポントは数字ですが, 後述の様に, 複数の文字のコードポイントを連結して表示するときはテキスト値に成るようです。FilemakerではCode関数に引数として任意の文字を指定すると, 5ケタのコードポントが返されます。
逆にChar関数という関数があって,引数としてコードポントを指定すると, そのポイントのUnicode文字が返されます。
2つ以上の文字をCode関数に入力すると,左右が逆になって連続したコードポントが返されます。
例 Code(“蘇")→34311, Code(“我")→25105, Code(“蘇我”)→2510534311
ちなみにこの連続コードポントをChar関数に入れると
Char(2510534311)→”蘇我” と返されます。
基本的にCode関数で返されるコードポントは5ケタの数字ですが,ASCII文字は2桁で返されます。姓名にASCII文字(アルファベット)を使う場合は全角で入力すれば5ケタの数字が返されます。
さらなる例外に、サロゲートペアというものがあります。当初のUnicode体系からあふれた非常に特殊な(日本語としては)文字を表現するときに5ケタx5ケタのコードポントで表現するというものです。
例 Code(“𡑮")→5643055365 となります。
ただ, この例外もそのままChar関数に入力すれば, Char(5643055365)→“𡑮” と戻ります。
話を本題に戻します。
姓名文字列の中にある空白スペースは 以下のようになります。
半角: Code(“ “)→00032 全角: Code(“ “)→12288
半角スペースは1文字なら32(数字)ですが, 複数の文字の中にあると 00032 と5ケタ(テキスト)で表示されます。
半角スペース: Code(“蘇我 うま子“)→233761241412358000322510534311
全角スペース: Code(“蘇我 うま子“)→233761241412358122882510534311
カスタム関数MiddlePositionで, 00032, 12288 を見つけ出し,その前後を分離して取り出して, Char関数で姓, 名に戻せばいいわけです。
サンプルソフト
( Script: 姓名分離_Code) では 姓名文字中に半角あるいは全角の空白スペースが1つあることを想定しています。しかし, 外国の名前には 3つに区切れるものもあります。それは ディアログを出して, 空白スペースが1つになるように手を入れてから, 姓,名を取り出すことにします。
カスタム関数も取り込んでいます。(Intermediate, Middule_Position)
追伸
手間をかけてCode関数, Char関数を使って見ましたが, 全角スペース “ “, 半角スペース” ” をそのまま用いて,Middle_Position関数だけでも, Unicodeを意識しなくても問題なく目的が達成されます。
( Script: 姓名分離_MP)
話題 04 Code関数とChar関数
姓と名を正確に分ける