[[Rの備忘録]] たとえば "あ" の UTF-8 での文字コードは > charToRaw("あ") [1] e3 81 82 なのですが,Unicode では > library(Unicode) > as.u_char(utf8ToInt("あ" )) [1] U+3042 です. Windows環境では CP932 コードなので > charToRaw("あ") [1] 82 a0 > as.u_char(utf8ToInt(iconv("あ", to= "UTF-8"))) [1] U+3042 合成文字の場合 #ref(nchar.png) #ref(nchar2.png) この変換規則は,[[ここ:http://hp.vector.co.jp/authors/VA012733/doc/kanji-code.html]] に分かりやすく書かれています.一部引用します. ---------------------- UCS-2(Universal Character Set coded in 2 octets)は2バイトのUnicodeのデータです。ASCIIの”a”と言う文字は0041の2バイトで、「U+0041」と表記します。UTFとは「Unicode Transformation Format, 8-bit encoding form」の略でASCIIとのご完成を保つために作られたようです。ASCIIは1バイトで表し、漢字コードなどは3バイトで表します。 UCS-2からUTF-8の変換表 UCS-2 ビット列 第1バイト 第2バイト 第3バイト U+0000...U+007F 00000000-0xxxxxxx 0xxxxxxx なし なし U+0080...U+07FF 00000xxx-xxyyyyyy 110xxxxx 10yyyyyy なし U+0800...U+FFFF xxxxyyyy-yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz 例として、上記の表から、”あ”と言う文字を変換します。Unicodeで”あ”はU+3042ですのでこれをビット列にすると、 「0011 0000 0100 0010」 となり、表を参考にしてxyzに分けると、 「xxxx=0011、yyyyyy=000001、zzzzzz=000010」 バイト単位に組み立てます。 第1バイト=11100011 HEX表記でE3 第2バイト=10000001 HEX表記で81 第3バイト=10000010 HEX表記で82 UTF−8で”あ”の文字コードはE38182です。 -------- 関連して,[[ここ:http://yanok.net/dist/jis2004unicodeskk.html]] に面白い記事があったので,引用させていただきます. JIS X 0213の文字のUnicode合成表現のためのSKK辞書 これは何か? 仮名漢字変換プログラムSKKのための辞書ですが、少々特殊な目的のものです。 JIS X 0213の文字には、Unicodeの符号化を施すと結合文字を使ってふたつの符号位置の連続によって表現する必要のあるものがあります。そうした文字について、JISで定義される単一の符号位置でなく、Unicode流の合成表現の文字列を出すための辞書です。 例えば、鼻濁音を表す「か゚」という文字(JISの面区点番号1-04-87)について、「か + 合成用半濁点」という列を出力します。合成用半濁点の表現にはHTMLの文字参照を使って、「か゚」として表します。 なぜ・どういうときに必要なのか? 簡単にいうと、Emacs 21/22 + Mule-UCS + SKKの環境で、アイヌ語や鼻濁音の文字、一部の発音記号などを含むHTML文書を入力しUTF-8で保存するのに適しています。 EmacsとSKKを使うと、JIS X 0213の全ての文字を自由に扱うことが可能です。JIS X 0213の文字を入力したバッファは、EUC-JIS-2004やShift_JIS-2004、あるいはUTF-8などで保存が可能です。 しかし、UTF-8で保存しようとした場合に、Mule-UCSを使うと問題があります。それは、Unicodeで符号化するときに単一の符号位置がなく結合文字を使って表現する必要のある25文字については、正しく保存されないというものです。例えば、「か゚」という文字はUTF-8として保存できません。 そこで、Unicodeで必要な合成の表現を文字入力の段階で生成してしまうのが、この辞書の目的です。「か゚」という1文字の代わりに、「か゚」という文字列を入力するのです。これによりMule-UCSでもUTF-8で保存できますし、それをHTMLとしてWebブラウザで表示すれば「か゚」と表示されます(表示環境がこの文字に対応していればですが)。 結合文字が表示や処理上どう扱われるかは実装によって対応がまちまちなので、辞書上では基本的にHTMLの文字参照を用いています(ただし˥˩と˩˥については文字そのものを記しています。この扱いはのちのち変えるかもしれません)。用途としてHTMLやXMLの編集を想定しているので、この形式が妥当なものと考えます。 辞書ファイル 辞書ファイルは下記リンク先にあります。EUC-JIS-2004 (EUC-JISX0213)で符号化されています。 [[SKK-JISYO.ucscomp:http://yanok.net/dist/SKK-JISYO.ucscomp]] --------- さらに関連して,[[ここ:http://yanok.net/yanok/mt-search.cgi?search=Unicode&__mode=tag&IncludeBlogs=1&limit=20&offset=20]]に面白い記事があったので,引用させていただきます. Mule-UCSでは、JIS X 0213の文字のうちUnicodeで表現する際に結合文字を使って二つの符号位置によって表す必要のある25文字は(例えば「ㇷ゚」)、Unicode系の符号化方式では正しく保存されないのです。EUC-JIS-2004のようなJIS X 0213の符号化方式なら問題ないのですが。 そこでどうすればいいかというと、仕方ないので結合文字はHTMLの文字参照で表すことにします。「ㇷ゚」ならば「ㇷ゚」のように書くのです。せっかくUTF-8を使っているのに文字参照を使うのは何だかなあという感じですが、致し方ありません。 文字参照で表すといっても、手で打つのは面倒ですから、これもSKKで変換してしまえ、ということになります。SKKの第3・第4水準漢字辞書では「ぷ」から「ㇷ゚」を入力できますが、それに加えて「ㇷ゚」という文字参照付きの表現も辞書に登録してしまうのです。「゚」というのが合成用の半濁点だと覚えておけば、格好は悪いですがともかく入力・編集することはできます。 ただし、SKKの辞書形式では「;」はアノテーションを示す区切り文字として意味を持っているので、ちょっと特別な書き方をしてやる必要があります。 下記に例を示します。私はこれをSKK-JISYO.ucscompという名前で保存して、SKKの辞書のひとつとして読み込ませています。 ;; -*- mode: fundamental; coding: euc-jisx0213 -*- ;; ;; okuri-ari entries. ;; okuri-nasi entries. nga /(concat "か゚\073")/(concat "カ゚\073")/ nge /(concat "け゚\073")/(concat "ケ゚\073")/ ngi /(concat "き゚\073")/(concat "キ゚\073")/ ngo /(concat "こ゚\073")/(concat "コ゚\073")/ ngu /(concat "く゚\073")/(concat "ク゚\073")/ が /(concat "か゚\073")/(concat "カ゚\073")/ ぎ /(concat "き゚\073")/(concat "キ゚\073")/ ぐ /(concat "く゚\073")/(concat "ク゚\073")/ げ /(concat "け゚\073")/(concat "ケ゚\073")/ ご /(concat "こ゚\073")/(concat "コ゚\073")/ せ /(concat "セ゚\073")/ つ /(concat "ツ゚\073")/ と /(concat "ト゚\073")/ ぷ /(concat "ㇷ゚\073")/ これによって、アイヌ語用に必要な文字と、鼻濁音用の半濁点付きカキクケコは、文字参照を使った表現が入力可能になります。ほかにも同種の措置の必要な文字が発音記号等にあるので、もうちょっと整備が必要かもしれません。 と、ここまで書いて気付いたのですが、環境によっては「ㇷ゚」などが正しく見えていないと思います。JIS X 0213対応のフォントを使って、新しめのブラウザを使えば表示できると思いますから、「ㇷ゚」が小書きのプに見えていない方はこの機会に環境をアップグレードされることをおすすめします。