-->

2010-04-10

array.patterns.Blocks.UTF-8.php part2

array.patterns.Blocks.UTF-8.php は http://unicode.org/Public/UNIDATA/Blocks.txt を UTF-8 と php と pcre で表現した場合の結果です。

前回と比べて変化は無いです。
利用するためのサンプルが、一度にマッチする量が多い場合に、セグメンテーション違反になっていたので修正しました。
wagnek.2010-04-10.tar.gz

(例 1) UTF-8 のファイルの、ファイル名を渡す。
$ date | nkf -w > date.txt
$ php wagnek.php date.txt
  2| Basic Latin    |   4| 2010
113| CJK Unified ...|   3| 年
  2| Basic Latin    |   3|   4
113| CJK Unified ...|   3| 月
  2| Basic Latin    |   3|  10
113| CJK Unified ...|   3| 日
  2| Basic Latin    |   1|
113| CJK Unified ...|   9| 土曜日
  2| Basic Latin    |  13|  19:48:55 JST
  1| Control Code...|   1| \n

(例 2) UTF-8 ではないテキストの内容を UTF-8 にして渡す。
$ cat ../wagahaiwa_nekodearu.txt | nkf -w | php wagnek.php | head -n10
113| CJK Unified ...|   6| 吾輩
101| Hiragana       |   3| は
113| CJK Unified ...|   3| 猫
101| Hiragana       |   9| である
  1| Control Code...|   2| \r\n
113| CJK Unified ...|  12| 夏目漱石
  1| Control Code...|   4| \r\n\r\n
  2| Basic Latin    |  55| -------------------------------------------------------
  1| Control Code...|   2| \r\n
100| CJK Symbols ...|   3| 【

文字を分割したい場合は chasen, kakasi, mecab がお勧めです。
"199| unknown" という文字が表示される場合、違う文字コードを渡している可能性が高いです。

(例 3) EUC-JP の文字を渡すと "199| unknown" が発生する。
$ date | nkf -e | php wagnek.php
  2| Basic Latin    |   4| 2010
  5| Latin Extend...|   2| ǯ
  2| Basic Latin    |   3|   4
199| unknown        |   2| \xB7\xEE
  2| Basic Latin    |   3|  10
199| unknown        |   2| \xC6\xFC
  2| Basic Latin    |   1|
199| unknown        |   6| \xC5\xDA\xCD\xCB\xC6\xFC
  2| Basic Latin    |  13|  19:55:51 JST
  1| Control Code...|   1| \n

unknown の場合1バイトずつ 16進数 で表現しています。
$ php -r 'var_export(mb_convert_encoding("\xB7\xEE", "UTF-8", "EUC-JP")); print "\n";';
'月'
$ php -r 'var_export(mb_convert_encoding("\xC6\xFC", "UTF-8", "EUC-JP")); print "\n";';
'日'
$ php -r 'var_export(mb_convert_encoding("\xC5\xDA\xCD\xCB\xC6\xFC", "UTF-8", "EUC-JP")); print "\n";';
'土曜日'

ǯ (ǯ) の部分は UTF-8 の別の文字コードにマッチしています。
$ php -r 'var_export(unpack("N", mb_convert_encoding(mb_convert_encoding("年", "EUC-JP", "UTF-8"), "UCS-4", "UTF-8"))); print "\n";';
array (
1 => 495,
)
$ php -r 'print dechex(495) . "\n";'
1ef
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF の 横 01E0 - 縦 F の部分です。

例えば、データベースに binary(blob)型で UTF-8 に似ているデータが入っている場合のサルベージや、サルベージするかどうかの検討に利用します。

0 件のコメント: