「テキスト入力」カテゴリーアーカイブ

 とは-文字参照あれこれ


とても基本的なことがどういうわけか分からなくなり、焦る・・・ということが最近多い。

今日、焦ったのは文字参照
これはHTML中に不等記号なんかのHTMLを崩してしまう特殊な文字を安全に表示させる方法で、これを利用してブログ記事やコメント欄なんかで♥と入力すれば表示ではに変換できる昔からのテクニックです。指「☞」とかだせますよ。
&heats;は文字なので文字実体参照、これを文字コードにすると♥(16進数) または &#9829(10進数) で、こっちを数値文字参照といいます。

自分は興味のある地元情報をWEBスクレイピングの技術を使って自動で集めており、集めたデータはおもっさまミカメジャーナルのウィジェットに表示させたりしてます。
クローリングした内容に が含まれていて、これが何かちょっと調べて問題なければ除去しようかと。

なんとなく、スペースか改行なんだろうと思うけど。

とりあえずPHPで数値参照、文字参照を変換するにはmb_convert_encodingが使えて
[php]

echo mb_convert_encoding(" ", "UTF-8", "HTML-ENTITIES");
[/php]
でいい。

コマンドラインPHPでやってみたので
[shell]

php -r ‘echo mb_convert_encoding(" ", "UTF-8", "HTML-ENTITIES");’ | less
[/shell]
すると<C2><A0>と表示されました。

分かる人には分かるのかもしれないけど自分にはよく分からない。

数値参照の数値はASCIIテーブルに格納されている番地だった気がするのでその表をみれば分かるかもしれないと思い、記憶を頼りに探そうとするのだけどどこにあったか思い出せない。
たしかすごくいいマッピングテーブルを8年位前にどっかでみた。それがみつからず。こういうことに時間使ってちゃあだめですね、自分。

Wikipediaで分かったのだけど数値参照の数値はUNICODEを基にした国際規格ISO/IEC 10646(UCS)の文字番号で指定するのだとか。

同じくWikipediaのISO/IEC 8859-1(Latin-1)のページでみつけたマッピングテーブル。

ISO/IEC 8859-1
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0x 未使用
1x
2x SP ! # $ % & ( ) * + , . /
3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4x @ A B C D E F G H I J K L M N O
5x P Q R S T U V W X Y Z [ \ ] ^ _
6x ` a b c d e f g h i j k l m n o
7x p q r s t u v w x y z { | } ~
8x 未使用
9x
Ax NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯
Bx ° ± ² ³ ´ µ · ¸ ¹ º » ¼ ½ ¾ ¿
Cx À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
Dx Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
Ex à á â ã ä å æ ç è é ê ë ì í î ï
Fx ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

UCSのマッピングテーブルをみたかったのだけど、これでもいいや。latin-1の横16列、縦16列の256文字(割り当てられてない領域も含む)はどの文字コードでも互換性のある基本中の基本で、この中に&#160;も含まれています。
160を16進数になおすとA0、ということで縦がAで横が0の列、「NBSP」が&#160;の正体でした。

NBSPとはNonBreakSpaceのことで文字参照の&nbsp;と書きます。
こちらのほうがHTMLコーディングしている人にとってはよく使いますよね。

&#160が&nbsp;の単なる別の表記だと分かったので、どちらも空白に変換するよう修正。
あぁ、ついでに16進数数値文字参照の&#xA0;も同じ処理にしとこう。
mb_convert_encodingで文字参照をすべて実体化する処理がすんなりいけば、それを最初にするだけでいいです。

ちなみにコマンドラインでみえた<C2><A0>はUTF-8でのNBSPらしい。C2A0で検索かけるといろいろでてきた。lessはそういう表示の仕方なんですね。

別の疑問が沸いてきます、空白にはSP(&#20;)が登録されているのに、なぜNBSP(&#160;)があるのでしょう。

これには欧文と和文の違い、そしてHTML上での表現の仕方が関係してそうなのですが、それについて調べてると長くなるのでまた今度!