文字コードの最近のブログ記事

北海道南部の松前町は、20世紀日本の書家・金子鷗亭の出身地であり、その影響で書道教育の盛んな町として知られています。

その松前で高校生の書道パフォーマンスの大会が開催されたニュースがありました。

上記のうち、函館新聞の方は記事の中にちょっと残念な部分があります。書家の名前が「金子鷗亭」と、「鷗」の字がHTMLの文字参照になってしまっています。40407は16進表記で9DD7にあたります。UnicodeでU+9DD7は第3水準漢字「鷗」の符号位置です。

人手で40407のような数字を入力したとは考えにくい。私の想像ですが、テキストエディタなどで「鷗亭」と入力したあとで、工程上の何らかの段階でシフトJISに変換することがあったのではないでしょうか。その際に、第3第4水準漢字まで対応しているJIS X 0213Shift_JIS-2004ではなく、第1第2水準までしか対応していないJIS X 0208ベースのShift_JIS (ないしはその誤った実装であるCP932) に変換しようとして、このような結果になったのではないか。

SJISとの変換が必要な時には、Shift_JIS-2004 ないしは Shift_JISX0213 を指定すれば、こうした問題は起きなくなります。Python, PHP, Java, libiconv等を用いるとUTF-8とShift_JIS-2004との間でコード変換ができます。

この鷗(かもめ)という字は、常用漢字には入っていませんが、人名用漢字には入っています。文化的な分野ではこの金子鷗亭や森鷗外といった人名に使われますし、白鷗大学 (栃木県) という大学名や鷗島 (北海道江差町) といった地名にもあります。いつでも使えるように、第3第4水準漢字に対応した符号化方式 (第3第4水準文字コード) を常に用いることが肝心です。

なお、上記ニュース記事のもう片方、毎日新聞の方では、「鴎」という略字体を使っています。これはJIS X 0208の1983年改正で大きく字体の変えられたものとして有名ですが、元は新聞による使用の方が83JISよりも先だったのだそうです。その意味では、新聞がこの略字を使うのは一貫していると言えなくもない。ただ、表外字の部分字体にも略字体を適用しようとするなら鴎の一字だけでなく全ての表外字が対象になるのか、そうでないのなら鷗が適用対象になる理由は何なのかと、方針がなかなか難しくなってくるので、元来の字体 (鷗) にあわせるのが無難であろうと思います。

GNU libiconvはJIS X 0213の符号化方式、Shift_JIS-2004 (Shift_JISX0213) や EUC-JIS-2004 (EUC-JISX0213) に対応していますが、コマンドを実行した際にこれらが入っていない場合もあり得ます。入っているかどうかはiconvのコマンドラインオプション --list で確かめられます。

これらの符号化方式に対応するには、ビルドする際にconfigureのオプション --enable-extra-encodings を指定しておく必要があるようです。インストールされているiconvコマンドでShift_JIS-2004が使えないときはこれが指定されていなかった可能性があります。もしこれらの符号化方式が入ってなかったら、管理者に相談するか、そうでなければ、自分でソースをダウンロードして上記のオプションを用いてビルドしてみるのもいいでしょう。

SJISやEUCと変換するときは常にShift_JIS-2004, EUC-JIS-2004を使いたいので、これらに対応した iconv コマンドを用意しておきたいものです。

参考: GNU libiconv

「2バイト文字」という言い方につっこみをしている人をあるところで見かけたので、これについて少々。

漢字や平仮名を「2バイト文字」のようにいう語法はずっと前からあります。昔からあるのだからいいのかというと、むしろこれは昔だからこそ便宜的に通用した言い方で、今では不適当です。順を追って説明します。

「何バイト」は文字そのものの性質ではない

まず、根本的なこととして、ある1文字の符号化表現に何バイトを要するかは、文字それ自体の属性ではなく、用いる文字コード (コード系) に依存することです。

例えば片仮名の「ア」を符号化するのに必要なバイト数は、JIS X 0201なら1バイト、JIS X 0213なら2バイト、UTF-8なら3バイト、UTF-32なら4バイトと様々に異なります。割り算の記号「÷」は、ISO/IEC 8859-1では1バイト、JIS X 0213では2バイト、UTF-32なら4バイト。

昔はあまり気にしなくてよかった

ただ、昔はそういう面倒なことを言わずに済んだのは、日本ではASCII/JIS X 0201とJIS X 0208だけを考えていれば良かったためです。これなら「漢字は2バイト文字」のような言い方で良かった。1バイトコードと2バイトコードを混在させると英数字や片仮名に1バイトと2バイトの両方が出てきますが、前者を「半角」後者を「全角」と呼ぶことであたかも別の文字のような扱いをすることで乗り切ってきた。

そういう牧歌的な時代が過ぎて、Unicodeが出てきたりまた8859など他の文字コードも意識するようになると、「どの文字コードの話をしているのか」をはっきりさせないと「何バイト」ということはいえなくなったわけです。

特定のコード系についての話ならOK

もっとも、逆に言えば、例えばShift_JIS-2004といった特定のコード系を前提とした場面では、「2バイト文字」とか「1バイト片仮名」といった言い方は全然アリです。

まとめ

  • 漢字や平仮名といった (コード系とは独立な) 文字種のつもりで「2バイト文字」というのは不適当。ある文字が何バイトかは用いるコード系による。
  • 特定のコード系を前提とした場面で、その系における1バイト文字、2バイト文字、のような言い方はOK。
  • なぜ昔はそういう煩わしいことを気にせずに済んだかというと、ASCII/JIS X 0201とJIS X 0208しか対象としていなかったから

関連記事

すごい後知恵なんですが、1980年代に「EUC」方式の文字コードをISOで国際標準化しておけば良かったのではと考えます。

EUC方式、というのがどういうことかというと、

  • 8ビット符号表のGL領域(0x20-0x7F)にASCIIを配置、
  • GR領域には2バイトの漢字コードを配置

という形が基本で、必要に応じてシングルシフトコードでG2, G3に指示されている2バイト(ないし1バイト)符号化文字集合をGRに呼び出せるステートレスな符号、というものです。

具体的には、EUC-JIS-2004, EUC-JP, EUC-KR, EUC-CNなどです。

これはISO/IEC 2022の枠内の運用なので、別段この方式を改めて標準化する必要はないのではないか、という意見もあるでしょう。しかし、型決めしておくことによるメリットもあります。理解が容易になり、設計や実装も使い回せる。特に2022は複雑ですからね。

ISO/IEC 8859という規格は、GLにASCII、GRに欧州等の各地域ごとの文字集合を配置した1バイトコード、という形になっています。この2バイト版があっても良かったのではないか。

それは世の中で「EUC」と呼ばれてそれなりに共有されているのだけども、ISOで標準化されていなかったのはもしかすると惜しかったのではないか。特に、2バイトコードが出てきた早いうちからそれがあれば......、と考えた次第です。

日経新聞のサイトに気になる題の記事が載っていました。

私は飲むとすぐ赤くなる方なので読んでみたのですが、異なる方面で発見がありました。通常JIS第3水準漢字で表記される単語が使われていたのです。

酒皶という言葉

記事の途中に、「鼻や頬の一部が飲んでいないときでも赤くなる症状を「酒さ」(しゅさ) と呼ぶ」とあります。この記事では平仮名にしていますが、漢字では「酒皶」と書きます。この「皶」という漢字はJIS第3水準、面区点番号1-88-70です。

なぜそんなことを知っているかというと、以前にも見覚えがあるからです。ブログ記事にもしています。

この記事では、『皮膚の医学 肌荒れからアトピー性皮膚炎まで』 (田上八朗著、中公新書) という本に出てきたのを取り上げていました。

この言葉は国語辞典の大辞林や広辞苑にも出てきます。第3水準漢字を使った「酒皶」という漢字表記も載っています。ちなみに広辞苑はこの酒皶という症状について「酒客に多いが飲酒と無関係にもおこる」としています。

病気や医学といった分野にも第3第4水準漢字は時々現れるのです。

文字入力とコード変換

この酒皶という単語は、Emacsで動作する文字入力プログラムSKKの第3第4水準辞書に入っていますから、SKKでは辞書ファイルとしてSKK-JISYO.JIS3_4を参照していれば、何も特別な操作なしに「しゅさ」という読みから変換できます。

文字コードとしてはUTF-8やShift_JIS-2004, EUC-JIS-2004などで扱えます。JIS X 0208ベースのShift_JISなどでは符号化できないので、SJISにコード変換する場合は下記のようにiconvコマンドでShift_JIS-2004 (Shift_JISX0213) を指定すれば文字化けせずにうまくいきます。

  iconv -f UTF-8 -t SHIFT_JISX0213 < utf8.txt > sjis.txt

書家・金子鷗亭の作品の特別展が北海道立函館美術館で開催されるとのニュースがありました。

金子鷗亭とは

金子鷗亭は1906年生まれ、2001年没で、函館から比較的近い松前町の出身です。1990年に文化勲章を受章しています。漢文に偏ったそれまでの書のあり方を批判し、生活に近い口語文や短歌などを題材とすることを提唱、漢字・平仮名・片仮名の調和を重視したということです。日本酒「一ノ蔵」のラベルでも知られます。

鷗という字と文字コード

この「鷗」はJIS第3水準、面区点位置1-94-69にあります。鳥のカモメの意味です。音読みではオウと読みます。

PCでかもめと打って変換すると「鴎」の方が先に出てくることが多いでしょう。こちらはJIS第1水準、1-18-10です。

JIS X 0208はもともと、18-10の位置に「鷗」がありました。しかし1983年改正で「鴎」という略字体に変更されてしまいました。これは表外字なので常用漢字体ではありません。新聞の紙面では、独自に略したこの字体が採用されていたそうです。JIS X 0208の拡張版であるJIS X 0213で、元の字体が第3水準漢字として1-94-69に復活しました。

このニュース記事では注釈として「文字化けを回避するため「かもめ」の人名用漢字を鴎に置き換えました」と記しています。「「かもめ」の人名用漢字」というのは間違いとも言いにくいですがちょっと微妙な説明です。確かに「鷗」は人名用漢字に入っていますが、この説明だと「普通のカモメの漢字のほかに「人名用漢字のカモメ」という特殊な漢字がある」かのような理解をしてしまう人がいそうです。そうでなく、元来「かもめ」の漢字は「鷗」なのであり、この字は常用漢字表には入っていないが子の名付けに使って良い字に含まれている、というのが実際のところです。一方、「鴎」は新聞などで使われた「鷗」の略字体で、83JIS変更によってPCではこっちの字体しか出ない状態が長く続いたので広まっているものです。

このような面倒な説明を避けるためには記事で「鷗」を使えばいいわけですが、このニュースサイトはJIS X 0208ベースの Shift_JIS を使っているので「鷗」は表現できません。JIS X 0213ベースに拡張した Shift_JIS-2004 や、Unicodeの UTF-8を使えば問題なく表現できます。その際、単にHTMLだけでなく、記事の執筆・編集・管理といった作業工程全体で第3第4水準文字コードを用いることが必要です。

例えば、作業工程のあるフェーズで、UTF-8にて作成したファイルをSJISに変換する必要があるなら、Shift_JIS-2004を指定すれば良いです。これなら、「鷗」のような第3第4水準漢字や、非漢字たとえば著作権表示記号やユーロ記号なども文字化けしません。iconvコマンドではこうします:

  iconv -f UTF-8 -t SHIFT_JISX0213 < utf8.txt > sjis.txt

逆向きの変換、つまりSJISからUTF-8に変換するには、-f と -t を入れ替えてやります。これはCP932の波ダッシュ問題も引き起こさず、最も正当な変換結果が得られます。

  iconv -f SHIFT_JISX0213 -t UTF-8 < sjis.txt > utf-8.txt

余談ながら

冒頭の展覧会は道立函館美術館で12月11日まで開催とのことです。この美術館、函館の観光名所・五稜郭のすぐそばにあります。新幹線も開業したことですし、旅行の一環として行くのにも向いているでしょう。

下の画像は年末、雪の時期の五稜郭の写真です。12月11日だとまだ雪は積もっていないかもしれませんね。函館美術館はこの五稜郭を上から眺める五稜郭タワーの近くにあります。

台湾語を使った結婚会見

リオ五輪でも活躍した卓球の福原愛選手の結婚会見についての記事が目を引きました。

台湾の江宏傑選手と結婚したことから日本だけなく台湾でも会見が行われました。そこで福原選手の話した言葉を取り上げたものです。

福原選手は以前から中国で卓球のトレーニングをしてきたので中国語(標準語、いわゆる北京語)に堪能だとのことです。台湾でも大陸から来た政権のもとで標準語たる北京語が普及していますが、一方、現地の言葉として台湾語というのがある。これは台湾の対岸に位置する福建省で話される閩南語が元になっています。北京語とは大きく異なるものだそうです。

福原選手は台湾の会見では台湾語で挨拶して現地の人々から好評を得たそうです。

台湾の言語事情についての書籍

台湾語の事情については、以前、本の紹介の形で当ブログの記事に書いたことがあります。

ここで紹介した本、『初めて台湾語をパソコンに喋らせた男—母語を蘇らせる物語』は、思ったより複雑な台湾の言語事情を含め大変興味深く面白かったので、気になる方は是非読んでみてください。

第3水準漢字の必要性

冒頭のニュース記事では台湾語のルーツについて「ビン南語」と記されていました。「閩南語」の「閩」がJIS X 0208の第1・第2水準にない漢字なのでこういう表記になったのでしょう。この字はJIS X 0213の第3水準、面区点1-93-49にあります。JIS X 0213の第3・第4水準漢字が使える環境なら、問題なく漢字で入力できます。

SKKの第3第4水準辞書を使うと「びんなん」という読みから「閩南」に変換できます。Macの辞書にも入っています。

このようなことからも、JIS X 0208でなくJIS X 0213を用いることの重要性が分かります。SJISとUTF-8の間のコード変換では、iconvで "SHIFT_JIS" の代わりに "SHIFT_JISX0213" を指定すれば、この「閩南」も問題なく変換できます。常にこのやり方を用いることをおすすめします。

瀬川拓郎『アイヌと縄文: もうひとつの日本の歴史』(ちくま新書)を読んでいたら、JIS第4水準漢字を見つけました。

(わん)」がそれです。JIS X 0213の漢字集合2面の4区87点にあります。文章の中で「青苗土器の埦は還元焼成気味で硬く」のように使われています。

どういう字か

この字は「碗」と同じように器を意味するようです。広辞苑では「飯・汁などを盛る陶磁器の食器」と説明されています。

埦飯(おうばん)」という熟語もあり、広辞苑にも載っています。ウェブ検索では百科事典の記述の一部としてもこの語が出てきます。また、埦を「「素焼き」で蓋つきの器」と説明しているページもあります(【茶道】盌と碗と椀と埦 )。

文字入力

Emacs上で動くSKKのJIS第3第4水準漢字辞書には、この「(わん)」や「埦飯(おうばん)」が登録されており、普通の単語と同じように読みから入力できます。

Macの仮名漢字変換では、「わん」から「埦」に変換できます。ただし「埦飯」は入ってないようです。

文字コードの扱い

JIS X 0213の第4水準漢字なので、Shift_JIS-2004やEUC-JIS-2004、UTF-8などで符号化できます。SJISのコード値はF1F5です。EUCでは8Fというシングルシフトコードに続けてA4F7とします(都合3バイトに見えます)。Unicodeの符号位置はU+57E6です。

UTF-8からSJISに文字コード変換するときは、iconvコマンドで下記のようにすれば「埦」という漢字も文字化けしません。

  iconv -f UTF-8 -t SHIFT_JISX0213 < utf8.txt > sjis.txt

この例の SHIFT_JISX0213 がShift_JIS-2004を意味します。EUCの場合はこれにかえて EUC-JISX0213 とします。反対にSJIS/EUCからUTF-8に変換するときは、オプション -f と-t を入れ替えます。

iconvの実装によっては SHIFT_JIS-2004 及び EUC-JIS-2004 という名前が使えるものもありますが、この名前に対応していないものもあります。SHIFT_JISX0213, EUC-JISX0213 であれば、一般的に問題なく使えるはずです。なおこれは名前だけの問題で、中身は SHIFT_JISX0213 も SHIFT_JIS-2004 も同じです。

第3第4水準漢字はいつでも出てくる

度々書いているように、文化的な文章にはしばしばJIS第3第4水準漢字が出てきます。

いつでも、第3第4水準漢字を扱える文字コードを使うことが重要です。具体的には、Shift_JIS-2004, EUC-JIS-2004, UTF-8などです。

アイヌ文化つながりで、先月書いた記事「札幌で見たJIS X 0213の文字」もご覧ください。こちらに出てくるアイヌ語表記用の片仮名の取り扱いにも、上記で説明した文字コード変換のコマンドが必要です。

札幌の中心部、大通公園と札幌駅を地下でつなぐ地下歩行空間を歩いていたら、パフォーマーが芸をしていました。その背後の柱に、JIS X 0213の文字が書かれているのが見えました。これはパフォーマーとは無関係にもともと書かれているものだと思います。次の写真です。

irankarapte

「イランカラㇷ゚テ」と書かれています。これはアイヌ語の挨拶です。写真には写っていませんが、他の柱には他の言語の言葉が書かれています。いろいろな言語が書かれているうちの一つです。

アイヌ語用の片仮名と文字コード

この中の小書きの「ㇷ゚」という文字は、もともと広く使われている日本の文字コード規格JIS X 0208になく、その拡張規格のJIS X 0213で符号位置が与えられたものです。漢字集合1面の、6区88点にあります。この文字は子音pの後に母音が続かない時に使われるもので、アイヌ語表記には頻出します。拙著『プログラマのための文字コード技術入門』では、アイヌ語で魚を意味する「チェㇷ゚」という語を題材として、符号化の例を示すのに使いました。

日本の文字コード規格は日本国内の言語表記に用いられる文字に対応しているべきですが、JIS X 0208は日本国内の言語であるアイヌ語に十分対応できておらず、ウェブサイトではfontタグを使って「プ」を小さくするような間に合わせの手段を強いられていました。日本国内の文字に不足があるというJIS X 0208の欠点を改善するJIS X 0213が規格化されて初めて、アイヌ語テキストの符号化が可能になりました。

なお、Macではアイヌ語の入力方式が日本語とは別に用意されています。これを使うと、「irankarapte」と打鍵すると「イランカラㇷ゚テ」と入力されます。

Unicodeではどうか

JIS X 0213の規格化を受けて、Unicodeにもアイヌ語用の片仮名が追加されました。ただし、結合文字を使って2つの符号位置の連続で表現できる文字については単独の符号位置が与えられませんでした。この「ㇷ゚」もその一つです。Unicodeでは、半濁点のつかない「ㇷ」の直後に合成用半濁点U+309Aを続けることで「ㇷ゚」を表現します。ちなみに半濁点のつかない小書きの「ㇷ」はアイヌ語の樺太方言の表記に使われるそうです。

この言葉の意味について

このイランカラㇷ゚テという言葉はアイヌ語の挨拶ですが、改まった感じのときに使われるものだそうです。この言葉については以前書いたことがあります。興味のある方はご参考に。

いつでも、どこでも、問題なく使えるように

この文字はJIS X 0213にあるので、Shift_JIS-2004, EUC-JIS-2004という符号化方式で問題なく使えます。今や、SJISというときはShift_JIS-2004、EUCというときはEUC-JIS-2004を使うことが必要です。そうでなければここで挙げたアイヌ語表記用の文字は使えません(CP932は論外)。

もちろん、Unicodeでも符号化できますから、UTF-8やUTF-16あるいはUTF-32でもOKです。ただし、結合文字で問題が出るようではいけません。つまり、「1文字=1符号位置」という前提のプログラムは駄目です。

アイヌ語表記用の文字に限らず、日本語ローマ字に使われる āīūēō のような長音符号つきのアルファベットや、尾骶骨の「骶」(1-94-21)、高校の教科書にある璦琿条約の「璦」(1-88-30)、リオ五輪の中国卓球選手・許昕の「昕」(1-85-14)、部首・字体記述要素の「亻」(人偏、2-1-21)、「礻」(示偏、2-82-64)、「灬」(列火、2-79-56)などなどの第3第4水準漢字が使えないのは日本の文字の符号化としてあまりに制約が大きいので、常にJIS X 0213の文字に対応した符号化方式を用いる必要があります(参考: 第3第4水準文字コードを使おう!)。フォントもJIS X 0213の全文字に対応したものを用いることが必要です(参考: 第3第4水準フォントを使おう!)。

その字はJISにある

スマホゲームのPokémon GOが大変話題を呼んでいます。

この名前の「Pokémon」の「é」、これはJIS X 0213の文字です。JIS X 0213の漢字集合1面、面区点1-09-63にあります。7ビット符号では295F、EUC-JIS-2004ではA9DF、Shift_JIS-2004では857Eというコード値になります。Unicode/UCSではU+00E9 (LATIN SMALL LETTER E WITH ACUTE) にあたります。

このアクセント符号つきの文字はフランス語において使われる文字としてよく知られています。"café" (カフェ)や "résumé" (レジュメ)といったフランス語の単語に使われます。文字コードとしては西欧向けの1バイトコードISO/IEC 8859-1 (Latin-1)に入っています。UnicodeもLatin-1の文字の並びをそのままコピーしていますが、JIS X 0213もやはりLatin-1の文字を全て含むように設計されているので、この文字も収録されています。ちなみにJIS X 0213は西欧のLatin-1だけでなく中欧東欧向けのLatin-2の文字も全部含んでいます。(細かいことをいうと、「Latin-1の文字を全て」には面倒くさい問題があるのですが、長くなるのでいずれ別の記事として書きましょう)

文字入力が大事

ニュースサイトの記事では、この「é」を使わずただの「e」にして注釈を添えているものがありました。入力ができなかったとしたら残念です。

Emacs上で動くオープンソースの仮名漢字変換プログラムSKKはJIS X 0213に対応しており、辞書ファイルSKK-JISYO.JIS3_4を使うと、打鍵操作「/e'␣」でこの文字「é」を入力できます。この辞書から派生して作られたATOK用のJIS第3第4水準辞書にも、アルファベットの大文字から変換できる形で入っているはずです。

私はこの記事をMacで書いていますが、キーボード「英字」ならびに「ABC Extended」では、「option-e e」でこの文字を入力できます。

iPadのソフトウェアキーボードでは、英語キーボードでeを長押しすると各種アクセント付きの文字の候補が上に出てきて、そこから選べます。ただし日本語のアルファベットモードはまた別のようです。こっちはよく分かりません。

この文字は日本の文字コード標準JIS X 0213で符号が与えられている文字なので、日本で使われるPCや携帯電話スマホなどでは特別な苦労なしに入力できるよう、文字入力プログラムが設計されているべきです。JIS X 0213の11,233文字は、全ての日本語対応プログラムがサポートすべき、今日の日本語環境のベースラインです。

なぜアクセント符号?

ちなみに聞きおよぶところでは、元々の日本での名称「ポケットモンスター」は英語では俗語に通じるため英語名称では「ポケモン」を使うようにした由で、さらに「Pokemon」という綴りだと英語ではeを日本語の「エ」のようには発音されないことからアキュートアクセント符号付きの「é」にされたそうです。

最近のブログ記事

函館の花火大会の第3水準漢字
花火大会の記事にJIS第3水準漢字があっ…
Unicode Standardの元号の説明の問題は変わっていなかった
生前譲位の報道でUnicode仕様書の元…
Unicode 9.0が出ています
UnicodeコンソーシアムからUnic…
ISO/IEC 10646:2014/追補2:2016がダウンロード可能に
国際規格のISO/IEC 10646:2…
染色工芸家の第3水準漢字:「芹沢銈介」
東京国立近代美術館のツイッターを見ていた…

広告