文字数制限

| コメント(0) | トラックバック(0)

この前、ちょっと古めかしい感じのするウェブアプリを使ったら、テキスト入力欄の脇に「100バイトまで」のような注記が添えられていて、なんともいえない気持ちになりました。

まあ、意図するところはわかります(少なくとも私には。そして多分これをお読みの貴方にも)。わかるけれども、もうさすがにこれはないんじゃないか。

これは、「コンピュータで使える文字には1バイトのハンカクモジと2バイトのゼンカクモジとがある」という、古き良き時代の、今では通用しない発想に基づいているのでしょう。

そもそも原則的なことをいえば、1文字が何バイトかなんていうことは、利用者は知りようがない。かつては、全角に見える文字は2バイト、半角に見える文字は1バイト、という概念があったわけですが、それは過去のある時期のコンピュータの実装にすぎないわけです。

用いる文字コードによって、同じ文字でも要するバイト数は異なります。念のため具体例を見てみましょう。

  • 「亜」はUTF-16では2バイト、UTF-8では3バイト、UTF-32では4バイト
  • 「÷」はISO/IEC 8859-1では1バイト、EUC-JIS-2004では2バイト
  • 「𩸽」は、Shift_JIS-2004では2バイト、EUC-JIS-2004では(SS3制御文字こみで数えると) 3バイト、UTF-{8|16|32}では4バイト

UTF-8やUTF-16が盛んに使われている現在、1文字何バイト、と、単に文字の種類だけから決め打ちにすることはできません。

さらに、Unicodeの場合は結合文字があるので話がややこしくなります。「が」というのは普通は1文字と数えますしUnicodeにもそれ用の符号位置U+304Cがありますが、一方で、「か」U+304Bと合成用濁点U+3099の2つの符号位置の列でもって「が」を表すことも可能です。UTF-16でいえば、「が」に対応するバイト列が2バイトかもしれないし、4バイトかもしれないということです。

こうなると、「何バイト以内」を人に数えさせるというのは全く意味をなさなくなります。

(余談ながら、Unicode 2.0の仕様書では、第1章の1行目で高らかに「The Unicode Standard is a fixed-width, uniform encoding scheme」とうたいあげており、同じページにはUnicodeの特徴を表す図として「Wide ASCII」とキャプションの付いた図を掲げて、いかにもUnicodeが16ビット固定長、16ビット版のASCIIであるかのように印象付けていますし、2.2 Unicode Design Principlesという節では「Sixteen bit characters: Unicode character codes have a uniform width of 16 bits.」と断言しています。ちなみにこのバージョンではサロゲート領域が定義されています)

利用者に見せる文言として「何バイト以内」という書き方はさすがにあまりしないにしても、データの格納領域の都合などで制限をしたいことはあるでしょう。そういうときは「何文字以内」のように書きたいわけです。しかし上記のようにUnicodeでは見かけの文字数とバイト数との間に明確な対応関係はないので、ASCIIとJIS X 0208だけ考えていればよかった昔のようにはいきません。

Twitterはご存じのように「140字以内」といっているわけですが、ここに同様の問題があります。これに関して、興味深い投稿を見かけました。

チベット文字はインド系文字に分類され、中心となる字の周囲にいろいろ文字や記号をくっつける構成をとります。その小さな構成要素のひとつひとつがUnicodeでは合成用の符号位置であるわけです。なので、1文字分の幅のところに3つも4つも符号位置が組み合わさっていることがあります。そのため、140文字といっても、チベット語を書くにはずいぶん少ない。中国語はあんな複雑な漢字が「1文字」扱いされてるのに...という不満です。(興味のある方は、上のリンク先のウェブページの中のチベット文字をテキストエディタなどにコピーして、バックスペースキーで1文字ずつ消してみたりすると面白いでしょう)

私の記憶では、以前Twitterの入力欄は、残り文字カウントが「140」のところに「𩸽」を入力すると一気にカウントが2減って「138」になりました。サロゲートを使う文字は2文字分に数えられていたわけです。しかし今では、この字は「1文字」ぶんとしてカウントされるようになっています。改良したのでしょうか。

しかし結合文字を使う場合は、やはり、1つの符号位置が「1文字」扱いされているように見えます。それで上記のチベット文字の不満も出てくるわけです。日本語の関係でいえば、鼻濁音の「か゚」のような字、これはUnicodeでは合成用の半濁点を使って2つの符号位置で表すのですが、これもTwitterでは「2文字」扱いになります。本当に「人が見て認識する1文字」単位にするには、結合文字の扱いを考慮する必要があるわけです。なお、チベット文字の「1文字」がチベット語話者の立場から通常どのようにとらえられているのかは私には分かりません。

トラックバック(0)

トラックバックURL: http://yanok.net/yanok/mt-tb.cgi/399

コメントする

最近のブログ記事

libiconv に JIS X 0213がない場合
GNU libiconvはJIS X 0…
「キュレーション」なる語について
DeNAのキュレーションサイトWelqの…
雪の青の夜景、札幌と函館
何日か前の朝のNHKニュースで札幌の夜景…
「2バイト文字」という言い方
「2バイト文字」という言い方につっこみを…
EUCが国際標準化されていれば良かった
すごい後知恵なんですが、1980年代に「…

広告