読者です 読者をやめる 読者になる 読者になる

グダグダな文字処理の話

技術部のヴァンサンです。

前回の記事ではiPhone 6対応の話を主に書きましたが、今となって殆どのアプリがiPhone 6対応を終えているので、今回は違った面白い話をしようと思います。ただ、書き加えたいことが1つだけあります。昔からあるSprings & StrutsがAuto Layoutより楽な時もあれば、コードで位置を決めることが一番ふさわしいこともありますね。

では、文字の話をしましょう。

「文字」って子供でも分かるものですよね。

でもパソコンにとって文字や文字の処理って複雑ですね。

パソコンが世界の殆どの言語を対応したいなら、複雑なところがたくさんありますね、例えば:

  • アラビア語(العَرَبِيةُ)やヘブライ語(עברית)は右から左へ書く言語です。その中に英字を入れると右から左への中に左から右への部分が混ざっています。
  • アラビア語は文字がつながっていて、1つの文字が単語の中にある位置によって形が変わります(単語の冒頭、末尾、中の3種類)。
  • ヒンディー語(हिन्दी)みたいにデーヴァナーガリー(देवनागरी)文字を使う言語は文字の組み合わせがさらに複雑です。
  • タイ語(ภาษาไทย)は日本語と同様、単語がスペースで区切られていないのですが、単語の間でしか行を区切れません。なので行を切っていいかどうかを確認するために文章を解析する必要があります。
  • などなど

でも日本語に絞っても、シンプルなものではありませんね、例えば:

  • 文字数が多いですね。特に珍しい漢字も含みますと。そのせいでフォントを作るのがかなり大変ですし、キャッシュとかにかなりスペースを使いますね。
  • 多くの言語は打った文字がそのまま文章に入るのですが、日本語はIME(入力方式エディター)が必要ですね。
  • 「イルカ」、「いるか」、「海豚」、(または「鯆」)って同じものを指しますが、文字が完全に別物なので同じ風に扱うのが難しいです。
  • あいうえお順でリストを表示したい時、各項目の読みが分からないと並び順を決められません。多くのアプリみたいにあいうえお順にしないと、リストの中に探すのがかなり大変ですよね。
  • 単語の間にスペース区切りがないため、単語がどこから始まるのかどこまで続くのか判断がかなり難しいです。内容を自動的に分析したい時にかなり不便ですね。
  • 縦書きを表示したい場合、文字が上から下へになるだけではなく、長音符や句読点を回転させなければいけませんね。英字が入っている場合、英字での単語を回転させるのかさせないのか。
  • ルビ(ふりがな)を表示したい時、難易度がまた上がりますね。
  • 日本語と中国語の判別も難しいですね、特に漢字だけで出来ている短い文章("了解"とか)や名前だけを表示する時。日本語が中国語として表示されると基本的に読めますけど読みにくいですよね。

英語だけを対象にするなんて英語圏楽すぎますね(笑)。

OSが標準で多くのことをやってくれるのがありがたいですね。多くの国、文化が絡んでいるところもおもしろいですね。

日本語の組版に興味ある方はW3Cの日本語組版処理の要件がいいかもしれません。斜めで見るだけでおもしろいと思います。

多言語の処理に興味ある方は結局、英語ですが、Unicodeの仕様がありますね。特に第二章。もっと読みやすい本あるんでしょうけど(笑)

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/