2014/01/11(土)Directional Formatting Characters に関するメモ
大部分の言語ではテキストを左から右へ表示するけど、アラビア語やヘブライ語は右から左に表示するらしいです。しかしながら、それらの言語のテキスト中に数字や英語などの左から右へ表示されるテキストが含まれると、テキストが「左から右」と「右から左」の双方向性を持つことになってしまいます。そのため、双方向性を持つテキストをどう表示したら良いか曖昧性が生じます。(恐らくレンダリングエンジンが)よしなに表示してくれることもあるけど、それだけでは十分でないケースがあるため、方向性を制御できるように「Directional Formatting Characters」が必要になるっちゅうこっちゃ。
「Directional Formatting Characters」の一覧は以下の通り。
U+061C ARABIC LETTER MARK
U+2066 LEFT-TO-RIGHT ISOLATE
U+2067 RIGHT-TO-LEFT ISOLATE
U+2068 FIRST STRONG ISOLATE
U+2069 POP DIRECTIONAL ISOLATE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+202A LEFT-TO-RIGHT EMBEDDING
U+202B RIGHT-TO-LEFT EMBEDDING
U+202C POP DIRECTIONAL FORMATTING
U+202D LEFT-TO-RIGHT OVERRIDE
U+202E RIGHT-TO-LEFT OVERRIDE
恐らく、99.9%ぐらいの日本語がメインのテキストではこれらのフォーマット文字は不要であると考えられるので、拙作のPerlモジュール「Lingua::JA::NormalizeText」ではこれらの文字を削除するオプションを用意しています。(Webアプリケーションでこられの文字を埋め込んでイタズラされちゃうおそれがあるため)
さらに詳しい情報は↓を参照されたし。 Unicode Standard Annex #9
2014/01/01(水)PerlのUnicode::Numberによる数値漢数字,大字 変換メモ
コード:
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use open qw/:utf8 :std/;
use feature qw/say/;
use Unicode::Number;
my $u = Unicode::Number->new;
my @number_system_list = qw/
Japanese_Regular_Simplified
Japanese_Regular_Traditional
Japanese_Legal_Simplified
Japanese_Legal_Traditional
Japanese_Western_Mixed
/;
for my $number_system (@number_system_list)
{
say $u->number_to_string($number_system, '1234567890');
}
say "\n";
for my $number_system (@number_system_list)
{
say $u->string_to_number($number_system, '壹拾貳億參仟肆百伍拾陸萬柒仟捌百玖拾')->to_string;
}
# segmentation fault が発生する
#say $u->string_to_number('Japanese_Regular_Simplified', '123');
say $u->number_to_string('Japanese_Regular_Simplified', '123');
say "Yay!";
実行結果:
十二億三千四百五十六万七千八百九十
十二億三千四百五十六萬七千八百九十
壱十弐億参仟四百五十六萬七仟八百九十
壹拾貳億參仟肆百伍拾陸萬柒仟捌百玖拾
12億3,456万7,890
1234567890
1234567890
1234567890
1234567890
1234567890
Not a decimal number: must contain 0-9 at /home/***/Unicode/Number.pm line 43.
という感じで想定外の入力を渡すと死ぬようです。(Unicode::Number Ver. 0.005)
ちなみに「Japanese_Regular_Simplified」みたいなのは「Unicode::Number::System」のSYNOPSISのコードを実行させると出ます。