2013年2月アーカイブ

見るともなしにテレビをつけていたら、字幕にJIS第3水準漢字が現れたので俄然目を引きました。

バラエティー番組で、人の名前として「(きよし)」と出ていました。もちろん名字も映っていましたが、そちらは忘れました。

この字「絜」は、JIS X 0213の1面90区4点にあります。

ぱっと見、何か知っている字の異体字かなという印象も受けますが、そうではないようです。漢字源によると、音読みでケツあるいはゲチと読み、意味は「きざむ」「つなぐ」「むすぶ」等が記されています。「ひもに目じるしのむすびめをつけること」からきているそうです。

テレビでは人名として出てきたわけですが、この字は常用漢字にも人名用漢字にも入っていないので、現在は子供の名前に新たにつけることはできません。この方の年齢は確か80代と紹介されていたと思います。

第3第4水準辞書では、「きよし」から「絜」に変換できます。音読みの「けつ」からも変換できます。

2つ前の記事では、ScalaプログラムからShift_JIS-2004のテキストデータを読み込んでUTF-8にして出力してみました。これで、Shift_JIS-2004を読み込めることが分かったわけです。

では、Shift_JIS-2004で出力する方はどうか。おそらく問題ないのでしょうけど、一応やってみないことには、どんな落とし穴があるか分かりません。

文字コードとしてShift_JIS-2004を指定してファイルを読み込むよう開き、1行読み込んではまたShift_JIS-2004として別のファイルに書き出してみます。内部コードがUnicodeなので、いったんUnicodeに変換したのちに元のSJISにするということになります。往復変換 (round-trip conversion) がうまくいくかを見たいわけです。

import scala.io.Source
import java.io.PrintWriter

val inputFile = Source.fromFile("hoge.sjis.txt", "x-SJIS_0213")
val outputFile = new PrintWriter("hoge-out.sjis.txt", "x-SJIS_0213")

try {
    for (line <- inputFile.getLines) {
        outputFile.println(line)
    }
} finally {
    inputFile.close
    outputFile.close
}

今回は前回と違って行番号なしで、元のまま出力します。これを実行した後で、

diff hoge.sjis.txt hoge-out.sjis.txt

とすると、差分なし、つまり綺麗に元通りに戻ったということでした。

念のため、常用漢字人名用漢字のCSVのSJIS版について同じことをして、うまくいくことを確認しました。

全部の文字を試したわけではないけれども、問題の起こりそうなポイントはおさえているので、多分大丈夫でないかと思います。

ちなみに、Shift_JIS-2004に対応している言語はほかにはPythonやGaucheがあります。これらはEUC-JIS-2004にも対応しています。また、OSでいうとMac OS XはShift_JIS-2004に対応しており、OS添付のテキストエディタでも扱うことができます。

日本人が書いた英文を見て、明らかに簡単に直せる間違いというものがしばしば見受けられます。そのひとつにスペースのあけ方があります。

英文には、スペースのあけ方や句読点の使い方、大文字・小文字の使い分けといった、見た目の整え方について、確立された慣習があります。英文に不慣れな方はあまり気にしないと思いますが、これをおろそかにすると稚拙な印象を与えかねません。

細かいところまでいうと結構煩雑なルールに思えます。しかし基本的な事項はごく覚えやすいものですし、そのごく覚えやすいルールも違反しているものは案外目立ちます。ここでは2つだけ見てみましょう。

  • 文の区切りとしてのピリオドやカンマの後にスペースをあける (前にはあけない)
    良い例: I went to Nagasaki, Kanazawa, and Hakodate. I like these cities.
    悪い例: I went to Nagasaki , Kanazawa,and Hakodate.I like these cities.
  • 括弧や引用符の外側にスペースをあける (内側にはあけない)
    良い例: Natsume Sōseki (1867-1916) is my favorite author.
    悪い例: Natsume Sōseki(1867-1916 )is my favorite author.

この2つを知っているだけで、大きな違いになります。もちろん、無意識のうちにこうしたルールを習得している人も多いでしょう。

ピリオドやカンマといっても、例えば "e.g." のような場合や "3,980" のような桁区切りにはスペースをあけません。文の区切りとして使われる場合と覚えておけば、大体間違いないはずです。

細かな規則は、ネットを検索すると解説がいろいろ見付かります。例えば「英文タイプのスペーシングルール」など。文末のピリオドの後のスペース2つというのは今では古いといわれるそうで、細かいところではゆれがあるかもしれません。ただ、基本的なところをおさえておけば、大きく外すことはないと思います。

こうしたことは、メールなどに英文を書く場合はもちろん、プログラムの中のスペースのあけ方にも適用できます。プログラムの場合は例えば関数呼び出しの括弧の前はスペースをあけないなどの慣習があったりしますが、そうした場合以外は英文のタイプの仕方に準じるとスマートに見えます。

Java 7ではShift_JIS-2004への対応が追加されています(OracleのサイトのSupported Encodings参照)。前から気付いてはいたのですが、今まで何となく試す機会がないままいました。

文字コードの名前として "x-SJIS_0213" という文字列で登録されています。文字コードを指定できる場面でこの文字列を指定してやればOKです。ご承知のようにJavaの内部コードはUnicodeなので、この場合の対応というのはUnicodeとのコード変換が実装されているということです。

Javaで対応したということは、Scalaでも使えるんだろうと思って、Scalaで簡単なプログラムを書いて試してみました。

// ファイルからテキストを読み込んで別のファイルに行番号をつけて出力する
import scala.io.Source
import java.io.PrintWriter

val inputFile = Source.fromFile("hoge.sjis.txt", "x-SJIS_0213")
val outputFile = new PrintWriter("hoge-out.utf8.txt", "UTF-8")

try {
    var i = 1
    for (line <- inputFile.getLines) {
        outputFile.println(i + ": " + line)
	i += 1
    }
} finally {
    inputFile.close
    outputFile.close
}

hoge.sjis.txtという名前のShift_JIS-2004のファイルを読み込んで、行番号をつけた上でUTF-8にしてhoge-out.utf8.txtというファイルに出力します。

試しに作ったhoge.sjis.txtを同じディレクトリに置いておいて scalaコマンドで上のプログラムを実行すると、hoge-out.utf8.txtが作成されます。Scala 2.10.0とOpenJDK 1.7.0をインストールしたUbuntu Linux 12.10で試しています。

出力ファイルを見たところでは期待通りに動作しているようです。以下のようなファイルができます。

1: test file.
2: あいう
3: αβ
4: 鷗     # 第3水準、BMP、一般名詞
5: 米芾   # 第3水準、BMP、人名
6: 褚遂良 # 第3水準、BMP、人名
7: 蔡邕   # 第3水準、BMP、人名
8: 𩸽  # 第4水準、SIP、一般名詞
9: 渞  # 第4水準、BMP、名字
10: 氵  # 第4水準、BMP、字体記述要素
11: 剝離  # 第3水準、BMP、サ変名詞、JIS2004追加、常用漢字
12: 𠮟咤  # 第3水準、SIP、サ変名詞、JIS2004追加、常用漢字
13: 神  # 第3水準、BMP、互換漢字
14: ㇰ  # アイヌ語用片仮名
15: ㇷ゚  # アイヌ語用片仮名、要結合文字
16: 〜  # WAVE DASH U+301C

なお、Java 6でも、途中のUpdateから対応しています。現時点の最新版では使えるはずです。

個人的には、JIS X 0213の符号化方式としてはEUC-JIS-2004に対応してくれた方が嬉しいのですが、SJISももちろん必要な措置ではあります。

プログラマのための文字コード技術入門』を書いたときにはUnicodeの携帯絵文字はまだ標準化作業の途中だったので、その時点での情報を記しておきました。最終的にできた仕様は本に書いた時点の案とは違うものになっています。ここで簡単にふれておきましょう。

国旗の絵文字を表すために、"Regional Indicator" という特殊な記号を使います。U+1F1E6からU+1F1FFまでの範囲に、例示字形としては点線で囲まれたAからZまでのアルファベットが用意されています。このアルファベットを使って、例えば日本なら「JP」というISO 3166の国コードを表す。つまり符号位置としてはU+1F1EF U+1F1F5という列になります。絵文字に対応した環境でこの列を表示すると、JPすなわち日本の国旗の絵文字を出力する、という具合です。

HTMLの文字参照で書けば、日本の国旗は「&#x1f1ef;&#x1f1f5;」ということになります。実際にこのブログ記事のHTMLの中に書けば「🇯🇵」になるのですが、見えるでしょうか。iPadやMacでは見えるようです。iPod Touch第2世代では点線に囲まれたJとPが見えていて、国旗としては出力しないけれどもregional indicator自体は認識されているような見た目です。全く見えない環境も多いでしょう。まあ、あまり気に病むことはありません。

Unicodeの仕様書を見ると、別にどの国旗に対応してないといけないと規定されているわけではないし(それを言い出したらいろいろ大変でしょう)、枠組みは用意しておいたのであとはよろしく、といった感じです。Unicodeコンソーシアムのサイトでダウンロードできるcode chartにはこのregional indicator symbolについての説明があるのですが、とても弱気な感じが味わい深い。

In some emoji implementations, certain pairs may be recognized and displayed by alternate means; for instance, an implementation might recognize F + R and display this combination with a symbol representing the flag of France.

someとかmayとかmightとかいってて、これ書いた人は本当は実装してほしくないんじゃないかとさえ思えてきます。

今日は2月11日、建国記念日にちなんだお話でした。(?)

外国から来た人が医療や介護の資格を取ろうとするのですが、しかし資格試験に出てくる専門用語の漢字が大変難しいので、知識や技能があってもなかなか合格できない、という話を過去何度か聞いたことがあります。最近またテレビで見ました。

こういうことが話題になると、漢字なんていっそのことやめてしまえという極端な意見がネットに出てくることもあります。まあ、ネットに出てくる意見が極端なことは珍しくないですが。

最近見た番組では、漢字に振り仮名をつけて対応したという話でした。それはそれでいいことでしょう。

ただ、この手の話で気を付けなければいけない点として、難しいのは文字なのかそれとも言葉なのか、ということがあると私は思います。

例えば、「腋下」という字面は、特に外国語として日本語を学んでいる外国人には、難しいと感じられるかもしれません。それなら、「漢字は難しい、けしからん」といえば済む話なのかといえば、そうではないと思います。

仮にこれを「えきか」と平仮名で書き直したらどうでしょうか。難しい漢字を知らなくても、確実に読めますね。でも、意味は分からないのではないでしょうか。文字が読めても、意味が分からないのではしようがない。

この言葉は、「わきのした」という意味です。「わきのした」という言葉はやさしいですが、「えきか」は、何のことか分からない人の多い、難しい言葉といえるでしょう。

つまり、表記に用いる文字の問題もさることながら、その文字が表す言葉の問題が大きいのではないか、ということです。漢字が難しいというのはそうだけども、使われている言葉自体がそもそも難しいのではないか、と思うわけです。平仮名で書いたって、言葉自体が難しいのなら、依然難しいわけです。

さて、先ほど、漢字は難しいといいましたが、漢字で「腋下」と書かれたのを見ると、この言葉を知らなくとも、「もしかすると、わきのしたのことかな? ちょっと自信ないけど」と思った人も少なくないのではないでしょうか。どこかで「腋 = わき」というつながりを見た覚えがある人なら、それを手がかりにして「腋下 = わきのした」と類推できるわけです。そうなると、むしろ漢字の方が分かりやすいということもできるでしょう。もちろん、こういう効力を得るためには漢字をたくさん読んだ経験が要るので、初学者向きではないでしょうけど。

英語でも、「使われている文字はやさしいけれども言葉は難しい」ということはあります。

「otorhinolaryngology」という英語をご存じでしょうか。とても難しそうですね。使われているのは中学1年で習った普通のアルファベットだけです。しかし、こうして見ても、意味が、そして読みも、分からないという人が多いのではないでしょうか。

これは耳鼻咽喉科を意味する単語です(実はこのまえ病院の待合室でこの英語を見付けて、なんだこの変な言葉はと思ったので調べたのです)。なぜこんな難しそうなのかというと、ギリシャ語からきているためです。ギリシャ語の、耳、鼻、のど、学問、という言葉をつなげたものからきているそうです。かくいう私もギリシャ語なんて全く分かりませんが。It's all Greek to me! もっとも英語話者もこういう長くて難しい言葉を嫌ってか、"ear, nose, throat" の頭文字をとってENTともいうそうです。

ここで私がいいたいのは、使われている文字が簡単なら言葉自体も簡単とは限らないということです。平仮名だけ、あるいは英語のアルファベットだけでも、難しい言葉というのはある。言語運用を円滑にしていくためには、文字だけの問題なのか、それとも言葉自体が難しいのか、ということも検討する必要があります。

プログラムの中の変数名やメソッド名、関数名、クラス名といった識別子には英数字のみを使うことが多いですが、Java言語では漢字や平仮名・片仮名などを使うこともできます。変数名を「年齢」だとかメソッド名を「賞与計算」だとかいう風にすることもできるわけです。

Java言語仕様の中で識別子に使える文字が規定されています。もっとも、使える文字の一覧がこの言語仕様書に示されているわけではなく、実際にはCharacter.isJavaIdentifierStart(int) と Character.isJavaIdentifierPart(int) がtrueを返す(前者が識別子先頭、後者が2文字め以降に対応)文字という風に、Characterクラスに丸投げしています。

どんな文字が使えるのかはAPIリファレンスのCharacterクラスの上記メソッドの説明にざっくり書かれています。簡単にいえば、記号類でなく言語表記のための文字はなんでもいけます。ラテン文字はもちろん、ギリシャ文字、キリル文字、漢字、平仮名、などなど。数字も(2文字め以降は)もちろん大丈夫。

分かりにくいのは記号類です。通貨記号はいいとして、「連結句読点文字」(connecting punctuation character)というあまり一般的と思われない用語が素っ気なく使われています。例として '_' が挙げられていて、これが「連結句読点」かといわれればそんな気もしますが、ほかに何が該当するのかこれで分かる人は少ないのではないでしょうか。ここで意味するところはUnicodeDataでいうカテゴリConnector Punctuation (省略形Pc)に相当するらしく、ほかにはU+203F UNDERTIEなど少数があるようです。

さて、この前ちょっと調べ物をしているとき、これに関連して、興味深いブログ記事をふとしたはずみで見つけました。

Java 6まではJIS X 0208にある中黒(中点)「・」をメソッド名の中に使えていたのに、Java 7になったらコンパイルエラーになった。これはどうしたことだと。

このブログで説明されているところでは、Javaの言語仕様が変わったわけではなく、Unicodeの文字カテゴリの定義で、中黒は上で触れた「Pc」として以前は分類されていたのに、Java 7の対応するUnicodeのバージョンでは「Po」(Other Punctuation)に変更になったと。このため、以前は中黒を識別子に使うことができたのに、Java 7ではできなくなったというのです。このブログ記事は大変丁寧に調査・説明されています。

文字コード表の例示字形に変更がなくても、属性の定義の変更によって、影響があり得るわけですね。

ちなみに、Java 6の文字情報はUnicodeバージョン4.0、Java 7は6.0に基づいています。APIリファレンスのCharacterクラスのところに記載があります。また上記ブログによると、中点のカテゴリがPcからPoに変更されたのはUnicode 4.1だそうです。

ウェブサイトの「日本の庭園100選」というのを見ていたら、鎌倉の建長寺のところで、頭の中に警報音が鳴り始めました。

「8・ノ池を中心とした庭園は...」とあります。何か文字化けでもしたようです。

建長寺についてウェブを検索してみたところ、どうやら「蘸碧(さんぺき)池」という池のようです。難しい字ですね!

この「蘸」という字は、音読みで「さん」、訓読みで「ひたす」と読むそうです。意味は、「ひたす。物を水中に入れる。水につける」(漢字源より)。つまり、この池の名は(みどり)をひたす、という意味になり、あるウェブサイトでは「緑の木々の色が青い水にひたって輝いていることを表している」と説明されています。

文字コードとしては、この「蘸」の字はJIS第3水準、面区点番号1-91-44です。ですから、UTF-8やEUC-JIS-2004、Shift_JIS-2004といった第3第4水準文字コードで扱うことができます。上記の文字化けのあったサイトでは、製作のどこかの段階でテキストデータが第3第4水準文字コードに対応していない環境を経由したのではないでしょうか。

文字入力の際には、第3第4水準辞書を使うと、音読みの「さん」から「蘸」に変換できます。ただし同音異字が大量にあって面倒です。訓読みの「ひたす」からも変換できるので、そちらの方が便利でしょう。なんて便利な辞書なんだ! (ただし、送り仮名を伴う動詞としては登録されていません)

そのうち建長寺にも足を運んで、この蘸碧池にも行ってみたいと思いました。

広告