NAME

Unicode::LineBreak::JA_JP - UAX #14 Unicode 行分割アルゴリズム

SYNOPSIS

use Unicode::LineBreak;
$lb = Unicode::LineBreak->new();
$broken = $lb->break($string);

DESCRIPTION

Unicode::LineBreak は、Unicode 標準の附属書14 [UAX #14] で述べる Unicode 行分割アルゴリズムを実行する。 分割位置を決定する際に、附属書11 [UAX #11] で定義される East_Asian_Width 参考特性も考慮する。

用語

便宜的に以下の用語を使う。

強制分割〔mandatory break〕は、基本規則で定められており、周囲の文字に関係なく義務的に実行される行分割動作。 任意分割は、基本規則で認められており、ユーザが実行すると決めた場合に行われる行分割動作。 [UAX #14] で定義される任意分割には直接分割〔direct break〕と間接分割〔indirect break〕とがある。

音素文字的な文字〔alphabetic characters〕は、通常、他の文字が分割の機会を与えないかぎり、文字同士の間で行分割できない文字。 表語文字的な文字〔ideographic characters〕は、通常、その前後で行分割できる文字。 [UAX #14] では音素文字的な文字のほとんどを AL に、表語文字的な文字のほとんどを ID に分類している (これらの用語は文字学の観点からすれば不正確である)。 若干の用字系では、個々の文字からは分割位置が明確にならないため、辞書による発見的方法を用いる。

文字列の桁数は、文字列に含まれる文字の数と等しいとはかぎらない。 個々の文字は広い〔wide〕か、狭い〔narrow〕か、前進を伴わない〔nonspacing〕かのいずれかであり、各々 2 桁、1 桁、0 桁を占める。 若干の文字は、使われる文脈によって広くも狭くもなり得る。 カスタマイズによって、文字はより多様な幅を持ちうる。

PUBLIC INTERFACE

行の分割

new ([KEY => VALUE, ...])

コンストラクタ。 KEY => VALUE の対については "オプション" を参照。

$self->break (STRING)

インスタンスメソッド。 Unicode 文字列 STRING を分割し、それを返す。

$self->break_partial (STRING)

インスタンスメソッド。 break() と同じだが、文字列を少しずつ追加して入力する場合。 入力が完了したことを示すには、STRING 引数に undef を与える。

$self->config (KEY)
$self->config (KEY => VALUE, ...)

インスタンスメソッド。 設定を取得または変更する。 KEY => VALUE の対については "オプション" を参照。

情報の取得

context ([Charset => CHARSET], [Language => LANGUAGE])

関数。 キャラクタセット CHARSET および言語コード LANGUAGE から、それを使う言語/地域の文脈を得る。

$self->eawidth (STRING)

インスタンスメソッド。 Unicode 文字列 STRING の最初の文字の East_Asian_Width 特性を得る。 返値については "定数" を参照。 EA_Z は前進を伴わない (幅のない) ことを意味する。 特性値 A (曖昧) は適切な値に解決する。

$self->lbclass (STRING)

インスタンスメソッド。 Unicode 文字列 STRING の最初の文字の行分割特性 (分類) を得る。 返値については "定数" を参照。 AI、SA、SG、XX の各分類は他の適切な分類に解決する。 ただし、東南アジアの表記体系のための単語分節が有効になっているときは、対応している用字系 (現在はタイ文字のみ) の文字の特性を SA のまま解決しない。

$self->lbrule (BEFORE, AFTER)

インスタンスメソッド。 分類 BEFORE と分類 AFTER の間での行分割動作を得る。 返値については "定数" を参照。

: このメソッドは、BK、CM、CR、LF、NL、SP の各分類に関わる規則については適切な値を返せないかもしれない。 また、AI、SA、SG、XX の各分類に関わる規則については意味のある値を返さない。

$self->strsize (LEN, PRE, SPC, STR)
$self->strsize (LEN, PRE, SPC, STR, MAX)

インスタンスメソッド。 MAX を指定しないと、[UAX #11] で定義された文字幅に基づいて、Unicode 文字列 PRE.SPC.STR の桁数を算出する。 正の値 MAX を指定すると、PRE.SPC.SUBSTR の桁数が MAX を超えないような STR の最長の部分文字列 SUBSTR の文字数を返す。

オプション

"new""config" の両メソッドには以下の対を指定できる。

CharactersMax => NUMBER

行に含みうる最大の文字数。行末の空白文字と改行の文字列を除く。 文字数は一般に行の長さを表さないことに注意。 初期値は 998

ColumnsMin => NUMBER

任意分割された行の、改行の文字列と行末の空白文字を含めない最小桁数。 初期値は 0

ColumnsMax => NUMBER

行の、改行の文字列と行末の空白文字を含めない最大桁数。つまり、行の最大長。 初期値は 76

"UrgentBreaking" オプションおよび "ユーザ定義の行分割動作" も参照。

Context => CONTEXT

言語/地域の文脈を指定する。 現在使える文脈は "EASTASIAN""NONEASTASIAN"。 初期の文脈は "NONEASTASIAN"

Format => METHOD

分割した行を整形する方法を指定する。

"DEFAULT"

初期の方法。 任意分割の位置に改行を挿入するだけ。

"NEWLINE"

"Newline" オプションで指定したもので改行を置き換える。 改行の前とテキスト終端の空白文字を除去する。 テキスト終端に改行がなければ追加する。

"TRIM"

任意分割の位置に改行を挿入する。 改行の前の空白文字を除去する。

サブルーチンへの参照

"行の整形" を参照。

HangulAsAL => "YES" | "NO"

ハングル音節とハングル連結チャモ〔conjoining jamo〕を音素文字的な文字 (AL) と扱う。 初期値は "NO"

LegacyCM => "YES" | "NO"

前に空白文字がついた結合文字を単独の結合文字 (ID) と扱う。 Unicode 5.0 版からは、空白文字のこのような使いかたは推奨されない。 初期値は "YES"

Newline => STRING

改行の文字列とする Unicode 文字列。 初期値は "\n"

SizingMethod => METHOD

文字列の長さを算出する方法を指定する。 以下のオプションが使える。

"DEFAULT"

初期の方法。 strsize() を使う。

サブルーチンへの参照

"文字列長の算出" を参照。

"TailorEA" オプションも参照。

TailorEA => [ ORD => CLASS, ... ]

個々の文字の East_Asian_Width 特性を調整する。 ORD は文字の UCS インデクス値か、それらの配列への参照。 CLASS は East_Asian_Width 特性のいずれか ("定数" を参照)。

初期値では、East_Asian_width 特性の調整はしない。 "文字の特性の調整" も参照。

TailorLB => [ ORD => CLASS, ... ]

個々の文字の行分割特性 (分類) を調整する。 ORD は文字の UCS インデクス値か、それらの配列への参照。 CLASS は行分割特性のいずれか ("定数" を参照)。

初期値では、行分割特性の調整はしない。 "文字の特性の調整" も参照。

UrgentBreaking => METHOD

長すぎる行の扱いかたを指定する。 以下のオプションが使える。

"CROAK"

エラーメッセージを出力して死ぬ。

"FORCE"

長すぎる文字列を無理やり分割する。

"NONBREAK"

初期の方法。 長すぎる文字列も分割しない。

サブルーチンへの参照

"ユーザ定義の行分割動作" を参照。

UserBreaking => [METHOD, ...]

ユーザ定義の行分割動作を指定する。 METHOD には以下のものを指定できる。

"NONBREAKURI"

URI を分割しない。 現在、HTTP(S) と (S)FTP(S) の URI に対応している。

"BREAKURI"

URI を SOLIDUS (スラッシュ) の前で分割する。 初期設定では、URI を SOLIDUS ので分割する。

[ REGEX, SUBREF ]

正規表現 REGEX にマッチする文字列を、SUBREF で参照されるサブルーチンで分割する。 詳細は "ユーザ定義の行分割動作" を参照。

定数

EA_Na, EA_N, EA_A, EA_W, EA_H, EA_F, EA_Z

[UAX #11] で定義される 6 つの East_Asian_Width 特性を表す値と、前進を伴わないことを表す EA_Z。

LB_BK, LB_CR, LB_LF, LB_NL, LB_SP, LB_OP, LB_CL, LB_QU, LB_GL, LB_NS, LB_EX, LB_SY, LB_IS, LB_PR, LB_PO, LB_NU, LB_AL, LB_ID, LB_IN, LB_HY, LB_BA, LB_BB, LB_B2, LB_CB, LB_ZW, LB_CM, LB_WJ, LB_H2, LB_H3, LB_JL, LB_JV, LB_JT, LB_SG, LB_AI, LB_SA, LB_XX

[UAX #14] で定義される 36 の行分割特性 (分類) を表す値。

MANDATORY, DIRECT, INDIRECT, PROHIBITED

行分割動作を表す 4 つの値。

強制分割。直接分割も間接分割も認める。間接分割を認めるが直接分割は禁ずる。分割を禁ずる。

Unicode::LineBreak::SouthEastAsian::supported

東南アジアの表記体系のための単語分節機能が有効かどうかを示すフラグ。 この機能が有効になっていれば、空でない文字列。 そうでなければ undef

: 現リリースでは現代タイ語のタイ文字にのみ対応している。

UNICODE_VERSION

このモジュールが参照する Unicode 標準の版を示す文字列。

CUSTOMIZATION

行の整形

"Format" オプションにサブルーチンへの参照を指定する場合、そのサブルーチンは 3 つの引数を取らなければならない。

修正後 = &サブルーチン(SELF, EVENT, STR);

SELF はオブジェクトのインスタンス、EVENT はサブルーチンが呼ばれた文脈を表す文字列、STR は分割位置の前または後の Unicode 文字列の断片。

EVENT |駆動の契機           |STR
-----------------------------------------------------------------
"sot" |テキスト先頭         |最初の行の断片
"sop" |強制分割の後         |次の行の断片
"sol" |任意分割の後         |続きの行の断片
""    |分割の直前           |行全体 (終端の空白文字を除く)
"eol" |任意分割             |分割位置の前の空白文字
"eop" |強制分割             |改行とその前の空白文字
"eot" |テキスト終端         |テキスト終端の空白文字 (と改行)
-----------------------------------------------------------------

サブルーチンは、テキストの断片を修正して返さなければならない。なにも修正しなかったことを示すには、undef を返せばよい。 なお、"sot""sop""sol" の文脈での修正はその後の分割位置の決定に影響するが、ほかの文脈での修正は影響しない。

たとえば次のコードは、行末の空白を取り除いて行折りをする。

sub fmt {
    if ($_[2] =~ /^eo/) {
        return "\n";
  	}
    return undef;
}
my $lb = Unicode::LineBreak->new(Format => \&fmt);
print $lb->break($text);

ユーザ定義の行分割動作

任意分割によって生じる行が CharactersMax、ColumnsMin、ColumnsMax のいずれかの制限を超えると見込まれるときは、引き続く文字列に対して緊急分割を実行できる。 "UrgentBreaking" オプションにサブルーチンへの参照を指定する場合、そのサブルーチンは 5 つの引数を取らなければならない。

分割後 = &サブルーチン(SELF, LEN, PRE, SPC, STR);

SELF はオブジェクトのインスタンス、LEN は先立つ行の長さ、PRE はその行の Unicode 文字列、SPC は追加される空白文字、STR は分割すべき Unicode 文字列。

サブルーチンは、文字列 STR を分割した結果の配列を返さなければならない。

たとえば次のコードは、若干の化学物質 (チチンのような) の名称にハイフンを挿入し、行折りできるようにする。

    sub hyphenize {
	return map {$_ =~ s/yl$/yl-/; $_} split /(\w+?yl(?=\w))/, $_[4];
    }
    my $lb = Unicode::LineBreak->new(UrgentBreaking => \&hyphenize);
    print $lb->break("Methionylthreonylthreonylglutaminyl...");

"UserBreaking" オプションの要素に [REGEX, SUBREF] の配列参照を指定する場合、サブルーチンは 2 つの引数を取らなければならない。

分割後 = &サブルーチン(SELF, STR);

SELF はオブジェクトのインスタンス、STR は REGEX にマッチする分割すべき Unicode 文字列。

サブルーチンは、文字列 STR を分割した結果の配列を返さなければならない。

文字列長の算出

"SizingMethod" オプションにサブルーチンへの参照を指定する場合、そのサブルーチンは 5 つか 6 つの引数を取らなければならない。

桁数 = &サブルーチン(SELF, LEN, PRE, SPC, STR);

文字数 = &サブルーチン(SELF, LEN, PRE, SPC, STR, MAX);

SELF はオブジェクトのインスタンス、LEN は先行する文字列の長さ、PRE は先行する Unicode 文字列、SPC は追加される空白文字、STR は処理する Unicode 文字列。

ひとつめの形式では、サブルーチンは PRE.SPC.STR の桁数を算出して返さなければならない。 桁数は整数でなくてもよい。桁数の単位は随意に選べるが、"ColumnsMin" オプションおよび "ColumnsMax" オプションのそれと一致させなければならない。

ふたつめの形式では、サブルーチンは STR の部分文字列の Unicode 文字の数の最大値を返さなければならない。部分文字列 SUBSTR は PRE.SPC.SUBSTR の桁数が MAX を超えないように取る。この形式は "UrgentBreaking" オプションを "FORCE" に設定した場合に使う。後の形式を実装したくなければ、undef を返さなければならない。

初期値では、文字列長の算出には strsize() を使っている。

文字の特性の調整

"TailorLB" オプションおよび "TailorEA" オプションで個々の文字の行分割特性 (分類) や East_Asian_Width 特性を調整できる。その際に便利な定数をいくつか定義してある。

行分割特性

初期値では、若干の平仮名や片仮名や仮名に準ずるものを行頭禁則文字 (NS) と扱う。 以下の対を TailorLB オプションに指定すれば、これらの文字を通常の表語文字的な文字 (ID) と扱える。

KANA_NONSTARTERS() => LB_ID

下記の文字すべて。

IDEOGRAPHIC_ITERATION MARKS() => LB_ID

表語文字的な繰り返し記号。 U+3005 繰返し記号、U+303B ゆすり点、U+309D 平仮名繰返し記号、U+309E 平仮名繰返し記号 (濁点)、U+30FD 片仮名繰返し記号、U+30FE 片仮名繰返し記号 (濁点)。

注。仮名ではないものもある。

KANA_SMALL_LETTERS() => LB_ID
KANA_PROLONGED_SOUND_MARKS() => LB_ID

小書き仮名。 小書き平仮名 U+3041 ぁ, U+3043 ぃ, U+3045 ぅ, U+3047 ぇ, U+3049 ぉ, U+3063 っ, U+3083 ゃ, U+3085 ゅ, U+3087 ょ, U+308E ゎ, U+3095 ゕ, U+3096 ゖ。 小書き片仮名 U+30A1 ァ, U+30A3 ィ, U+30A5 ゥ, U+30A7 ェ, U+30A9 ォ, U+30C3 ッ, U+30E3 ャ, U+30E5 ュ, U+30E7 ョ, U+30EE ヮ, U+30F5 ヵ, U+30F6 ヶ。 片仮名表音拡張 U+31F0 ㇰ - U+31FF ㇿ。 小書き片仮名 (代替名称) U+FF67 ァ - U+FF6F ッ。

長音記号。 U+30FC 長音記号、U+FF70 長音記号 (代替名称)。

注。これらの文字は行頭禁則文字と扱われることも、通常の表語文字的な文字と扱われることもある。[JIS X 4051] 6.1.1 参照。

注。U+3095 ゕ, U+3096 ゖ, U+30F5 ヵ, U+30F6 ヶ は仮名ではないとされる。

MASU_MARK() => LB_ID

U+303C ます記号。

注。この文字は仮名ではないが、通常 "ます""マス" の略記として用いられる。

注。この文字は [UAX #14] では行頭禁則文字 (NS) に分類されるが、[JIS X 4051] では文字クラス (13) (ID に相当) に分類される。

East_Asian_Width 特性

ラテン、ギリシア、キリルの各用字系では、特定の文字が曖昧 (A) の East_Asian_Width 特性を持っている。このため、こういった文字は "EASTASIAN" 文脈で広い文字と扱われる。 TailorEA => [ AMBIGUOUS_*() => EA_N ] と指定することで、そのような文字を常に狭い文字と扱う。

AMBIGUOUS_ALPHABETICS() => EA_N

下記の文字すべてを East_Asian_Width 特性 N (中立) の文字と扱う。

AMBIGUOUS_CYRILLIC() => EA_N
AMBIGUOUS_GREEK() => EA_N
AMBIGUOUS_LATIN() => EA_N

曖昧 (A) の幅を持つキリル、ギリシア、ラテン用字系の文字を中立 (N) の文字と扱う。

いっぽう、東アジアの符号化文字集合に対する多くの実装でたびたび広い文字に描画されてきたにもかかわらず、Unicode 標準では全角 (F) の互換文字を持つがゆえに狭い (Na) 文字とされている文字が若干ある。TailorEA オプションに以下のように指定することで、これらの文字を "EASTASIAN" 文脈で広い文字と扱える。

QUESTIONABLE_NARROW_SIGNS() => EA_A

U+00A2 セント記号、U+00A3 ポンド記号、U+00A5 円記号 (または元記号)、U+00A6 破断線、U+00AC 否定、U+00AF マクロン。

設定ファイル

"new" メソッドおよび "config" メソッドのオプション引数の組み込み初期値は、 設定ファイルで上書きできる。 Unicode/LineBreak/Defaults.pm。 詳細は Unicode/LineBreak/Defaults.pm.sample を読んでほしい。

BUGS

バグやバグのような動作は、開発者に教えてください。"AUTHOR" を参照。

VERSION

Unicode::LineBreak::Version を参照してほしい。

このモジュールの開発版が http://hatuka.nezumi.nu/repos/Unicode-LineBreak/ にある。

標準への適合性

このモジュールで用いている文字の特性値は、Unicode 標準 5.1.0 版による。

このモジュールでは、実装水準 UAX14-C2 を実装しているつもり。

  • 一部の表語文字的な文字を NS として扱うか ID として扱うかを選べる。

  • ハングル音節およびハングル連結チャモを ID として扱うか AL として扱うかを選べる。

  • AI に分類される文字を AL と ID のどちらに解決するかを選べる。

  • CB に分類される文字は解決しない。

  • 東南アジアの表記体系の単語分節に対応しない場合は、 SA に分類される文字は AL に解決する。 ただし、Grapheme_Break 特性の値が Extend か SpacingMark である文字は CM に解決する。

  • SG や XX に分類される文字は AL に解決する。

REFERENCES

[JIS X 4051]

JIS X 4051:2004 日本語文書の組版方法. 日本規格協会, 2004.

[UAX #11]

A. Freytag (2008). Unicode Standard Annex #11: East Asian Width, Revision 17. http://unicode.org/reports/tr11/.

[UAX #14]

A. Freytag and A. Heninger (2008). Unicode Standard Annex #14: Unicode Line Breaking Algorithm, Revision 22. http://unicode.org/reports/tr14/.

SEE ALSO

Text::LineFold::JA_JP, Text::Wrap.

AUTHOR

Copyright (C) 2009 Hatuka*nezumi - IKEDA Soji <hatuka(at)nezumi.nu>.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.