CAFE BABE MS874 CP33722 CP1383 CP1381 CP1258 CP1257 CP1256 CP1255 CP1254 CP1253 CP1252 CP1251 CP1250 CP1124 CP1123 CP1122 CP1112 CP1098 CP1097 CP1046 CP1026 CP 1026 CP 1046 CP 1097 CP 1098 CP 1112 CP 1122 CP 1123 CP 1124 CP 1250 CP 1251 CP 1252 CP 1253 CP 1254 CP 1255 CP 1256 CP 1257 CP 1258 CP 1381 CP 1383 CP 33722 IBM Latin-5 トルコ語 IBM Open Edition US EBCDIC EBCDIC イラン語、ベルシャ語 IBM イラン語、ベルシャ語 (PC) IBM ラトビア語、リトアニア語 IBM 工ストニア語 IBM ウクライナ語 IBM AIX ウクライナ語 Windows : 刺欧 / Latin-2 Windows キリル文字 Windows 欠 / Latin-1 Windows ギリシャ諞 Windows トノレコ語 Windows へプライ語 Windows アラビア語 Windows ノヾルト海沿岸 Windows ベトナム語 IBM OS/2 、 DOS 中国語 (JDK 1.1.1 以降 ) IBM AIX 中国語 (JDK 1.1.1 以降 ) Windows タイ語 (JDK 1.1.1 以降 ) IBM 日本語 eucJP ( 5050 のスーノヾーセット。 JDKI. 1.1 以降 ) 文字工ンコーディング (4)—Macintosh 工ンコーディング名 M acArab ic MacCentralEurope M acCroatian MacCyrillic MacDingbat MacGreek MacHebrew M aclceland MacRoman 、 1 acRomani MacSymbol M acThai MacTurkish MacUkraine 文字工ンコーディンク 工ンコーティング名 Unicode UnicodeBig UnicodeLittle 意味 Macintosh アラビア語 Macintosh Latin-2 Macintosh クロアチア語 Macintosh キリル文字 Macintosh Dingbat Macintosh ギリシャ日ロ Macintosh へプライ語 Macintosh アイスランド語 Macintosh Roman Macintosh ノレーマニア語 Macintosh Symbol Macintosh タイ語 Macintosh トノレコ語 Macintosh ウクライナ語 (5)—Unicode UnicodeBigUnmarked UnicodeLittleUnmarked UTF8 70 文合 Unicode 2.0 Unicode 2.0 Unicode 2.0 Unicode 2.0 Unicode 2.0 (Unicode 2.0 ) 意味 Unicode ( 入力は自動半」別、出力は Big Endian) Unicode (Big Endian) Unicode (LittIe Endian) UNIX MAGAZINE 1998.4 Unicode ( バイトオーダー・マークを含まない Little Endian 、 Unicode ( バイトオーダー・マークを含まない Big Endian 、 Uni- UTF-8 Unicode からの変換のみ ) code からの変換のみ )
表 3 UTF-8 のエンコーディング方法 Unicode 文字 U 十 0000 ~ U 十 007F U 十 0080 ~ U 十 07FF U 十 0800~U 十 FFFF パイト数 1 バイト 2 バイト 3 バイト ビットパターン OXXXXXXX 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx このような場合には、下記の方針に沿ってプログラミ UNIX MAGAZINE 1998.4 さらに、既存のエンコーディングと Unicode のマッピ 必要があります。 に、それがどの言言韶 ) データなのかを通イ詁目手に教える 語環境で使用する場合は、 Unicode シーケンスとは別 語なのかは簡単には区別できません。したがって、多国 たん Unicode に変換すると、日本語か、それとも中国 ただし、 Unicode 自体には言語清報がないので、いっ とかできます。 まり Unicode の Basic Latin) の部分を簡単に扱うこ Unicode のコントロール・コードや ASC Ⅱ文字 ( つ この表からも分かるように、可変長にはなりますが、 変換します。 られています。 UTF-8 では、 UTS-2 を表 3 のように ガ去で、従来の 8bit 環境でも容易に扱えるように考え を 8 ピット単位の可変長に変換するエンコーディング Unicode を扱えます。 UTF-8 は、 UCS-2 や UCS-4 とくに、 UTF-8 形式 (UTF8) を使うと、より簡単に である Unicode でそのまま通信すれはよいわけです。 べての文字を通信に利用するには、 Java の内部コード で扱える文字の一部しか使えません。 Java で級えるす 上の方法では、たとえば Shift-JIS で通信すると、 Java 2. Unicode て通信する する場合などに使用します。 ルで定められていたり、 Java 以外のプログラムと通信 このガ去は、利用するエンコーディングが通信プロトコ るプログラムなら、 JIS で送受信すればよいわけです。 ありません。たとえば、 JIS で通信すると定められてい 変換すれは、互いのエンコーディングか喰い違うことは イ訓叔こ JIS コードに変換し、受イ芋に JIS コードから JIS コードで通信することをあらかしめ決めておき、送 1. あらかしめ通信工ンコーディングを決定しておく ことを忘れてはいけません。 フォルト・エンコーディングにもとづいた変換はしない " ングするとよいでしよう。ただし、いすれの場合も、、、デ Java フログラミング・ノート IOXXXXXX 3. 通信の開女都芋にエンコーディングを決定する 場合があります。 ングは、 意には決まらないことが原因で間題が生しる ありません。 きるので、とくにエンコーディンク変換を考える必要は います。このガ去では、オプジェクトとして受渡しがで lnvocation) では、 Object Serialization かイ吏われて クトのメソッドを呼び出す RMI (Remote Method ization と呼びます。たとえは、遠隔の Java オプジェ たり保存することができます。これを、 Object Serial- Java では、オプジェクトをバイト列に変換して通信し 4. オプジェクトとして受け渡す ます。 手に対して通信内容のエンコードを宣言するガ去もあり ーディングを使います。このほかに、通信開始時に相 を互いに相談して決めておき、以後の通信でそのエンコ 通信を始めるときに、どのエンコーディングを使うか あります。 シーケンスを交換する場合には間題が発生しやすい傾向が 同時に使用したり、異なるプラットホーム間で Unicode に異なる方針のもとに言されているため、複数の規格を Unicode は、文字集合に関する既存の規格とは根本的 日本語コードと Unicode の相互変換 1. 類似したグリフをもつ文字の存れ から複数の変換↑嚇甫がありえます。 イングから Unicode に変換するときは、次のような理由 とくに、これまで日本で使われてきた既存のエンコーデ たとえば、 "(WAVE DASH) に似たグリフを もつ文字として、 Unicode には WAVE DASH ( U 十 301C ) 、 TILDE OPERATOR ( U 十 223C ) 、 REVERSED TILDE ( U 十 223D ) 、 INVERTED LAZYS ( U 十 223E ) 、 SIGN WAVE ( U 十 223F ) 、 FULLWIDTH TILDE (U 十 FF5E) などがあり ます。これ以外に、、、 II"(DOUBLE VERTICAL 63
CAFE BABE ・ "(HORIZONTAL ELLIPSIS) 、 LINE) 、 (MINUS SIGN) などの文字も同様の問題を抱えてい ます。 2. 全角 (FULLWIDTH) 、半角 (HALFWIDTH) 文字 の存在 これまで、日本では同じ文字を全角 / 半角といったよう にして、異なる形状の文字として重複定義して使ってき ました。しかし、 Unicode では、文字に対してコード ポイントを割り当て、グリフの違いは無見する基本方針 をとっています。その意味からも、上で述べたような 重複定義は望ましくないのですが、日本ではすでに同じ 文字を全角 / 半角という形で重複定義して使い分けてい るので、それを無見して互換性を損なうわけにはいきま せん。 そこで、既存のほかのコードセットからのコード変換の 互換性を一焉正するために、 Halfwidth and Fullwidth Forms (U 十 FFOO—U 十 FFEF) という領域を石呆し、 FULLWIDTH および HALFWIDTH という名前の 付いた文字を定義しています。これらの文字を使えば、 Unicode でも全角文字と半角文字を区別して扱うこと かできます。 たとえば、アルファベットの、、 A " に対しては、 LATIN CAPITAL LETTER A ( U 十 0041 ) と FULL- WIDTH LATIN CAPITAL LETTER A (U 十 FF21) が、カタカナの、、ア " に対しては、 KATA- KANA LETTER A ( U 十 30A2 ) と HALFWIDTH KATAKANA LETTER A (U 十 FF71) カ蔀寉保され ています。ただし、これらの文字は互換性 &f. 尉寺するた めに残されているだけであり、これ以外の目的で積極的 に使うことはできません。 しかし、記号類のなかには、日本では重複定義はされ ていなかったにもかかわらす、 Unicode で FULL- WIDTH 文字か不寉保されている場合があります。た 、、 0 "(CENT SIGN) や、、 "(POUND とえは、 SIGN) 、、、 "(NOT SIGN) がそうで、、、 0 " の変 換嚇甫には U 十 00A2 (CENT SIGN) と U 十 FFEO (FULLWIDTH CENT SIGN) の 2 つがあります。 3. ¥問題 ISO/IEC 646-IRV(ASCII) と JIS X0201 では、い ままで \ (REVERSE SOLIDUS) と、、 *"(YEN 64 -"(TILDE) と、 " (OVERLINE) は異な SIGN) 、 る文字として定義されていました。しかし、日本では、 同じコードボイントにあったために、これらを日埆寉に区 別してきませんでした。たとえは、 MS-DOS や C 言 語で \ の代わりに、、 \ " を使ってきたのは皆さんもご 存じでしよう。 しかし、 Unicode では、、 \ " と、¥ と は別 の文字として定義されています。このため、たとえ は、、¥ " を Unicode の YEN SIGN ( U 十 00A5 ) に 変換すると、 javac などのコンパイラで逆スラッシュ として使用していた部分が処理できなくなります。か といって、 REVERSE SOLIDUS ( U 十 005C ) に変 換すると、ピジネスソフトなどの通貨単位か文字化け してしまいます。 のはうも、 Unicode の OVER- LINE に変換すると HTML ファイルでエンコードさ れす、、 http://www.ingrid ・ org/&kazama/" と書か れていると扱えなくなるといった問題か起こります。と くに円記号の場合は深刻であり、、¥問題 (yen sign problem)" と呼ばれるはどです ( 同本ル ) 間題が、韓国語 についても起きています ) 。さらに、それぞれに全角文 字があり、変換候補はさらに多くなります。 以上のような間題から、日本語のエンコーディングと Unicode のマッピングは簡単には決定できません。表 4 に各規格て示されているマッピングの違いを、表 5 に各フ ラットホームにおけるマッピングの違いを示します。この 表は、各プラットホームがサポートしている文字の共通部 分、つまり JIS で定義されている部分だけをとりあげたも のです。 この表からも分かるように、日本語ェンコーディングか ら Unicode へのマッピングは一意ではありません。この ために、次の 3 つの場合に問題カ起こります。 1. TextFieId や TextArea などのプラットホーム・ネイ テイプな部品への文字の入力 このような場合は、プラットホームの Unicode のマッ ピングのまま渡されたり、プラットホームがもつ工ン コーディング・コンバータで変換されてから渡されるの で、それを Java のコンバータで正しく変換できないこ とがあります。 2. LabeI などのプラットホーム・ネイテイプな部品によ UNIX MAGAZINE 1998.4
CAFE BABE ただし、 Unicode では 16bit を超えた文字を可変長で 表現する Surrogate と呼はれる手法カ義されています。 これは ISO/ITC 10646 の UTF-16 と同しアルゴリズ ムです。将来、 ISO/ITC 10646 の UCS-4 で追加され た文字は Surrogate を使用して表すことになると思われ ますが、この場合にはかならすしも 1 文字が単独の char で表されないので、プログラム中では char 単独の受渡し は避けたほうがよいでしよう。 さらに、文字列を褓内する配列として char 酉改に byte 配列を使います。前者は Unicode 文字を 1 文字すっオ褓内 する配列、後者は Unicode 以外のエンコードの文字を 1 バイトすっ絲勺する配列です。文字を操作する場合は、な るべく彳あの StringBuffer クラスを使用してください。 Java プログラムで文字列を格納するオプジェクトの クラスとしては、 java. lang. String クラスと java ・ lang ・ StringBuffer クラスが用意されています。 String オプジ ェクトは Unicode 文字列の Read OnIy 表現で、 Java のメソッド間で文字を受け渡す、もっとも基本的なデータ 型です。 String に変更を加えたい場合は、 StringBuffer オプジェクトに変換してから文字列操作をおこないます。 StringBuffer クラスでは、便利なメソッドが用意されて いるだけでなく、マルチスレッド・プログラムを想定して 同期がとらさらに内ヾッフアの容量の管理も考慮さ れているので、 char 配列にアクセスするより便利で安全 です。 工ンコーディング名とエンコーディング変換 Java では、エンコーディングはエンコーディング名の String オプジェクトとして扱われます。現琲点では、工 ンコーディング名は独自の定義であり、 IANA (lnternet Assigned Numbers Authority) の文字集イ名には従っ ていません ( 将来的にはサポートされる予定です ) 。 工ンコーディングにかかわる操作のために、 sun. io ノヾ ッケージにはエンコーディング・コンバータに関する 2 不鶤頁のクラスが用意されています。 sun. io. ByteToChar- C 。 nverter クラスとサプクラスは、さまざまなエンコーデ イングの文字を Unicode に変換するクラスです。 sun. io. CharToByteConverter クラスとサプクラスは、これと は逆に Unicode からさまざまなエンコーディングの文字 に変換するクラスです。 58 これらのクラスは、滝版では java. io パッケージに入っ ていましたが、 . 正式版では sun. i 。パッケージに移さオフ ログラマーが直接使えなくなりました。これにともない、 次のことかできなくなりました。 ・指定したエンコーディングでサポートされていない文 字があった場合の処理の選択 (UnknownCharacter- Exception を発生するか、代替文字に変換する ) 代替文字窈尺 ・文字が変換可能かどうかの判断 ・どの文字セットをサポートしているかの判断 ・コンバータの追加 (sun. io 内にあるため ) 現在のところ、エンコーディング変換が可能なのは、 1. String オプジェクトと byte 配列の相圧変換 2. 文字ストリームの入出力 だけです。この 2 不頁のカ 1 去とは別に、 Unicode 工スケー プと Unicode の相圧変換も使われています。 この 3 不頁の相圧変換の関係を、図 1 に示します。 工ンコーティング・センシテイプなメソッドと デフォノレト・エンコーディンク Java では、いろいろなエンコーディング変換ができま すが、かといって簡単なアプリケーションを書くときに も、いちいち工ンコーディングを指定しなけれはならない のでは面倒です。そこで、プログラマーの負担を軽くする ために、デフォルト・エンコーディンク (default encod- ing) が定義されています。工ンコーディング変換をおこ なうメソッドでエンコーディングカ甘旨定されていない場合 は、デフォルト・エンコーディングカ甘旨定されたものとみ なされて処理されます。 プラットホーム側ですでにロケールか設定されていれ は、 VM 起重加学に表 1 のシステム・プロバティが設定さ れます。 たとえば、 Solaris 2 上でプラットホームのロケール が、、 ja " の場合は、、 EUCJIS " が設定されます。ただし、 プラットホームが違うと、ロケールが同しでもデフォル ト・エンコーディング名か異なることがあります。たとえ は、 Windows 95 上では、、 SJIS" になります。 UNIX MAGAZINE 1998.4
が付加されて String オプジェクトにタされてしまい、 Java プログラムで正しく処理できなくなります。このよ うな問題カ起こったときは、修正してもらうようにバグレ ポートを送るべきです。暫定的な対策としては、 newString(). getBytes("8859-1")) のように いったん逆変換してから先頭の 0X00 を削除 し、もとのバイト列に戻して、文字列を再隻デフォルト・ 工ンコーディングにもとづいて作成すれは回避できます。 工ンコーティング名一覧 Java で使用可能なエンコーディング名の一覧を末尾 に示します。現在、 JavaSoft からはすべてのコンバータ の言田な解説は公開されていません。そこで、 sun. io 以 ードのコンノヾータ・クラスと、 Java lnternationalization Specification 、 Java lnternational Overview のエン コーディング名一覧など窈帯長をもとに、この表を作成し ました。間違いなどがありましたら、ぜし扁集部までお知 らせください。 なお、サポートされているエンコーディングの不鶤頁は、 JDK のバージョンやプラットホームによって異なります。 JDK 1.1.6 でコンバータ関連の大幅な変更が予定されて いますが、 Java lnternational Overview の表の一倍には、 すでにこれにもとづいているようで、 JDKI. 1.5 までは存 在しなかったエンコーディング名が追加されています。そ こで、表にはそれらのエンコーディング名に、、 JDK 1.1.6 以降 " という注意書きを付けてあります。また、 IBM 向 けに用意されているコンバータには、日本語と韓国語につ いては同一コードベージに対して \ 問題を回避するために 2 不頁のマッピングが用意されていますにれらは、エン コーディング名の末尾に、、 C " が付いているかどうかで区 別するようです ) 。 ( かざま・かすひろ NTT 光ネットワークシステム研究所 ) [ 参考文献 ] [ 1 ] JavaSoft, JDK 1 コん 7 、れ観を 0 れた 0 0 れ 0 ? 肥理乞 e 1998 (http://www.javasoft.com/80/products/jdk/1 .1/docs/guide/intl/intlTOC. doc. html) [ 2 ] JavaSoft, JDK 1.1 ん " 厖 0 れた佖 0 れ Specifica- t れ , 1996 (http://java.sun.com/80/products/jdk/1 .1/intl/html/intlspecTOC. doc. html) UNIX MAGAZINE 1998.4 Java プログラミング・ノート [ 3 ] JavaSoft, C / 田 rac 7 、 streams JDK プコ , JDK 1.1.5 Documentation, 1997 [ 4 ] The Unicode Consortium, 7 ' ん e Unicode S れ d 田ヨ , Version 2.0 , Addison-WesIey, 1996 [ 5 ] Ken Lunde 『日本語清報処理ふソフトバンク、 1995 年 [ 6 ] 日本工業標準調査会『国際符号化文字集合 (UCS)—第一 部体系及び基本多言語面 JIS X 0221 ー 1995 (ISO/IEC 10646 ー 1 : 1993 ) 』、日本規格協会、 1995 年 [ 7 ] James Gosling, Bill Joy and Guy L. Steele, The ノ at 協ん 0 れ田 ge S を ec c 佖 0 れ , Addison-Wesley, 1996 [ 8 ] Mary Campione and Kathy Walrath, I'V ' れ 9 GIobal PT ・ ograms, The ノ aq T 厩 0 ロ襯 (http://java ・ sun ・ com/docs/books/tutorial/intl/) [ 9 ] Mark Davis, ノ at C00 ん 600 ん : Cre 佖れ 4 GIob 襯ス ca 0 れ s , 1997 (http://www.ibm.com/java.edu/a- tion/globalapps/ ( 邦訳 : ・田稔樹訳、風間一洋監訳「 Java Cookbook: グローバルアプリケーションの作成」、 1997 年 http://www.oki.co.jp/OKI/RDG/JIS/java/GIobaI Java/index. htm) [ 10 ] TOG/JVC CDE/Motif 技行於鈺寸WG 「 Unicode とユー サ定義文字・べンダ定義文字に関する問点と鮹策」、 1997 年 (http.//www.opengroup.or.jp/jvc/cde/ucs-conv. html) [ 11 ] GIenn Adams and John H. Jenkins, S ん - ノ / S to Unicode (version 0.9 ) , Unicode 1.1 & 2.0. [ 12 ] Lori BrownelI and K. D. Chang, c 〃 932 ー S んノ / S Unicode e (version 2.0 ) , Unicode 2.0 [ 13 ] Peter Edberg, イ acOS 一 / 佖 0 れ ese 〃 0 Unicode] (ver- sion 0.2 ) , Unicode 1.1 & 2.0 前回の訂正 前号 34 ページの Dynamic Composition と EquivaIent Sequence" の項で、「合成された文字を結合文字 (combining character) と呼びます」と書きましたが、「合成するために使 用される文字を結合文字 (combining character) と呼びま す」と訂正します。 67
Ja プログラミング・ノート 図 1 工ンコ ーディングの相互変換 Java ソースコード ( 任意の文字コード ) new String() Java (UTF-8) Java バイトコード (Unicode 工スケープ ) Java ソースコード native2asci i getBytes( ) javac StringBuffer ーー String (Unicode) ・一 (Unicode) new String Buffer() new String() getChars() バイト単位の I/O OutputStream putStream ( 任意の文字コード ) ー 文字単位のレ 0 byte[] save ( ) プロ / ヾティ・ファイル (Unicode 工スケープ ) 表 1 工ンコーティングのシステム・プロノヾティ プロバティ名 file. encoding プラットホームてイ吏用しているエンコーデ イング名 byte 配列と String オプジェクトの相互変換 すでに Java 内部に byte 配列として保持している任 意のデータに対してエンコーディンク畯換をおこなうため には、表 2-a のような String クラスのコンストラクタ を使用します。指定されたエンコーディング名がサポー トされていなけれは、 java. io. UnsupportedEncoding- Exception が発生します。なお、 char 配列はすでに Uni- code に変換された文字をオ褓内する配列なので、エンコー ディング変換は不要でありサポートされません。 たとえは、 EUC で byte 配列にオ褓内しておいた、、こん にちは " という文字列は、リスト 1 のプログラムで string オプジェクトに変換できます。 逆に、 String オプジェクトから任意のエンコーディン グに変換して byte 配列に格納するには、 String クラ スの getBytes() メソッドを使用します ( 表 2-b)0 指 定されたエンコーディング名がサポートされていなけれ ば、 java. io. UnsupportedEncodingException が発生 load() new String() Writer Reader char[] → (Unicode)+——— リスト 1 import byte 酉リから String オプジェクトへの変換 conversionl. Java) 」 ava. iO . * ; します。 たとえば、リスト 2 のプログラムでは、 UNIX MAGAZINE 1998.4 こんにちは " class conversionl { public static void main(String args ロ ) { byte b ロ { (byte) 0xa4 , (byte) Oxb3 , / / 59 という String オプジェクトから EUC の byte 配列をと }catch (UnsupportedEncodingException e) { } System. out . println() ; System. out . write(), 0 , b. length) ; byte[] b = s. getBytes("EUCJIS") ; try { String s こんにちは” public static void main(String args ロ ) { class conversion2 { lmport Java. iO. *; conversion2. Java リスト 2 String オプジェクトから byte 配列への変換 }catch (UnsupportedEncodingException e) { } System. out . println(s) ; String s new String(), "EUCJIS") ; try { (byte)Oxa4, (byte)Oxcf};// は (byte)Oxa4, (byte)Oxc1 , / / ち (byte)0xa4, (byte)Oxcb, / / に (byte)0xa4, (byte)Oxf3, / / ん
CAFE BABE Java プログラミング・ノート住 Ja a の国際化と日本語処理 ( 2 ) 風間一洋 工ンコーティング UNIX MAGAZINE 1998.4 れ以外に、文字とフォント、文字とスクリプト (Macin- 国の文字集合に含まれる文字を集めた Unicode です。 ーケンスて切り替えて使用する ISO 2022 や、さまざまな その一イ列か : さまざまな国の文字集合をエスケープ・シ 普新勺な表現が必要になります。 文字を正しく表示、交換、上交するためには、なんらかの コーディングをサポートしなければなりませんが、とくに あたっては、すでに使われているこれらの文字集合やエン 字集合やエンコーディングカリ用されています。国際化に おこなわれてきたため、コンピュータ上ではさまざまな文 今日にいたるまで、言語や国ごとに文字の標準化作業が 国際化と文字工ンコーティング 許容される範囲は文字集合の定義によって異なります。 して扱われなけれはいけません。ただし、同じ文字として をプリンタで打ち出しても、毛筆て書いても、同し文字と 的な概念として扱われます。たとえば、、、あ " という文字 た意味または形状をもっと考えられる図形集合を表す抽象 るグリフ (glyph) を直接意味するわけではなく、共通し し、文字集合では、文字は実際に表示される文字の形であ コーティンク (encoding) を定義して使用します。ただ 合 (character set) と、文字の符号イ試であるエン そこで、ある目的のために収集した文字の集合である文 文字とを結び付けるなんらかの規則が必喫です。 場合は、データ中のビットパターンと現実に使われている 読み書きさえできればいいのですが、コンピュータで扱う ろいろな文字が使われています。人間にとっては、文字は 世界中でさまざまな言語が使わさらに言語ごとにい tosh) の組合迂や、データのほかに属性をもっオプジェク トとして定義されることもあります。 国際化では、各文字集合やエンコーディングと、この 普遍的表現のあいだの変換が必要になります。 Java では Unicode を普遍的な表現として用いていますが、現在の 大部分の計算機環境では Unicode は使われていません。 Java プログラムが外部とデータを交換する際に、 Uni- c 。 de 以外のエンコーディングをデフォルトとする環境で のファイルの読み書きやほかのプログラムとの通信、文字 の描画などの処理をする場合は、エンコーディング変換が 必頭になります。 Java の国際化では、次の 2 不鶤頁のエンコーディンク変 換が使われています。 フォント・エンコーディングも文字を符号化する去で すが、データ交換ではなく文字の表示や印字のために描直 化されているので、かならすしも文字工ンコーディングと は一 -- ・致しません。 1. 文字工ンコーディングと文字工ンコーディングの相互 2. 文字工ンコーディングからフォント・エンコーディン グへの変換 今回は前者だけをとりあげ、後者については機会をあら ためて説明します。 文字列操作の基本型とオプジェクト Java では、文字をイ褓内するデータ型として char と byte を用いています。 char は Unicode 文字を、 byte は Unicode 以、タ ) 工ンコーディングの文字を 1 バイトだ けイ褓内します。 57
CAFE BABE 表 5 Unicode への文字マッピングい ( 2 ) ISO/IEC 646 \ ( D / 12 , REVERSE SOLIDUS) ~ ( F / 14 , TILDE) JIS X 0201 ¥ ( D / 12 , YEN SIGN) \ ( 1 ー 32 , REVERSE SOLIDUS ( 1-33 , WAVE DASH) Ⅱ ( 1 ー 34 , DOUBLE VERTI- CAL LINE) ( 1-36 , HORIZONTAL ELLIPSIS) ー ( 1-61 , MINUS SIGN) ( F / 14 , OVERLINE) JIS X 0208 ( 1-17 , OVERLINE) ( 1-29 , EM DASH) \ ( 1 ー 79 , YEN SIGN) 0 ( 1-81 , CENT SIGN) ( 1-82 , POUND SIGN) ( 2-44 , NOT SIGN) JIS X 0212 ~ ( 2 ー 23 , TILDE) Java (SJIS & EUCJIS U 十 005C (REVERSE SOLIDUS U 十 007E (TILDE) Java (JIS) U 十 005C (REVERSE SOLIDUS U 十 007E (TILDE) U 十 00A5 (YEN SIGN) U 十 203E (OVERLINE) Windows 95/NT U 十 005C (REVERSE SOLIDUS MacOS U 十 00A5 (YEN SIGN) U 十 FFE3 (FULLWIDTH MACRON) U 十 2015 (HORIZONTAL BAR) U 十 203E OVERLINE U 十 2014 EM DASH U 十 007E (TILDE) U 十 FF3C (FULLWIDTH REVERSE SOLIDUS) U 十 301C (WAVE DASH) U 十 FF5E (FULL- WIDTH TILDE U 十 2016 (DOUBLE VERTICAL LINE) U 十 2225 (PARALLEL TO) U 十 2026 (HORIZONTAL ELLIPSIS) U 十 2212 (MINUS SIGN) U 十 00A2 (CENT SIGN) U 十 00A3 (POUND SIGN) U 十 FFOD (FULLWIDTH HYPHEN-MINUS U 十 FFE5 (FULLWIDTH YEN SIGN) U 十 OOAC (NOT SIGN) U 十 FFEO (FULLWIDTH CENT SIGN) U 十 FFEI (FULLWIDTH POUND SIGN) U 十 FFE2 (FULLWIDTH NOT SIGN) U 十 301C WAVE DASH U 十 2016 (DOUBLE VERTICAL LINE) U 十 22EF (MIDLINE HORIZONTAL ELLIPSIS) U 十 2212 (MINUS SIGN) (NOT SIGN) U 十 OOAC (POUND SIGN) U 十 00A3 (CENT SIGN) U 十 00A2 ほかに、 - ヾンダーか独自に定義した文字の変換も、変 換テープルを独自にもたなけれはならない点、 Unicode 2.0 に含まれない文字をどうするかといった点で問題にな ります。 国ヒ未対応な部分の文 残念ながら、 Java の処理系や各 API を含めて、麒 点て元全に国際化されているとか、あるいは間題なく日本 語を扱えるとは言いにくい部分もあります。 よくある問題は、 Unicode を使っていても ISO 8859 ー 66 1 の範囲の文字しか扱えないことです。日本語は、膨大な 変換テープルを使わないと変換できません。これに対し、 ISO 8859 ー 1 を Unicode に変換する場合はう頁に 0X00 を付け、 Unicode から ISO 8859-1 に変換する場合に は逆に先頭の 0X00 を削除するという、ごく簡単なアル ゴリズムで実現できます。しかし、正しく国際化せすに、 ードコードしてごまかしているプログラムをよくみかけ ます。 この方法しかサポートしていない場合は、たとえは・ EUC や Shift-JIS の文字列は、 1 バイトすっク頁に 0X00 UNIX MAGAZINE 1998.4
CAIÅE BABE リスト 4 日吾リソースからメッセージを出力するプログラム ・メッセージを出力するプログラム (hello. java) import java. util . *; public class he110 { public static void main(String args ロ ) { ResourceBundIe r = ResourceBundIe . getBundIe ( "resource" ) ; System. out . println(). getString("message") ) ; 1 ) 日リソースの定義—resource-ja ・ java(l) import Java. util . *; public class resource—Ja extends ListResourceBund1e { こんにちは " } static final Object ロロ contents return contents ; public Object ロロ getContents() { " \ u3053 \ u3093 \ u306b \ u3061 \ u306f " } static final Object ロロ contents C011tentS ; public Object ロロ getContents() { public class resource—Ja extends ListResourceBund1e { import java. util . * ; 2 ) Unicode 工スケープに変換ー- ・ -resource-ja ・ java(2) 以外で言当したい場合、あるいは日本語リソースでも日本 吾以外の言語環境でコンパイルしたい場合は、正しく変換 されません。 そのようなときは、使用しているエンコーディング名 を javac の -encoding オプションで孑旨定するか、 na- tive2ascii を使って Unicode 工スケープに変換するとよ いでしよう ( リスト 4-2 ) 。 プロノヾティ・ファイノレ ( この例では resource-ja ・ pro- perties) では、次のように Unicode 工スケープが使われ ています。工デイタで直孑扁集したときは、 native2ascii を使って変換します。 message = \ u3053 \ u3093 \ u306b \ u3061 \ u306f いすれの場合も、次の実行結果カ碍られます。 % java he110 こんにちは 62 通信とエンコーディンク Java では、とくにエンコーディングを指定しない場合 はあらかしめ定義されたデフォルト値にもとづいて動作し ます。したがって、たいていはエンコーディングを指定す る必要はありません。さらに、このデフォルト値を利用す るようにプログラムを書けは、同し工デイタ・プログラム でも、 Solaris 2 上なら EUC で、 Windows 95 上なら Shift-JIS で読み書きすることになるので、プラットホー ムごとのエンコーディングの違いを意識せすにすみます。 しかし、ほかのプログラムと通信する場合にはデフォル ト値は使えません。なぜなら、通イ目手のデフォルト値が 同じとはかぎらないからです。たとえは、 Windows95 上 のプログラムどうしであれは、デフォルト・エンコーディ ングにもとづいて通信しても Shift-JIS で送受信できるの で間題はありません。しかし、 Solaris 2 上のプログラム と通信すると、相手のデフォルト・エンコーディングは日 本語 EUC なので、正しく通信できなくなります。 UNIX MAGAZINE 1998.4
IS08859 ー 1 IS08859 ー 2 IS08859 ー 3 IS08859 ー 4 IS08859 ー 5 IS08859 ー 6 IS08859 ー 7 IS08859 ー 8 IS08859 ー 9 K018-R 文字工ンコ CAFE BABE 文字工ンコーディング 工ンコーディング名 ューン一ランド、 ASCII 8859 ー 9 8859 ー 8 8859 ー 7 8859 ー 6 8859 ー 5 8859 ー 4 8859 ー 3 8859 ー 2 8859 ー 1 ( 1 ) 文合 ISO/IEC 646 ISO 8859 ー 2 ISO 8859 ー 1 ISO 8859-9 ISO 8859-8 ISO 8859 ー 7 ISO 8859-6 ISO 8859-5 ISO 8859-4 ISO 8859 ー 3 ISO 8859-1 ISO 8859 ー 2 ISO 8859-9 ISO 8859 ー 8 ISO 8859-7 ISO 8859-6 ISO 8859-5 ISO 8859 ー 4 ISO 8859-3 K018-R 意味 ASCII (JDK 1.1.6 以降 ) ISO Latin-1 ISO Latin-2 ISO Latin-3 ISO Latin-4 ISO Latin/ キリル文字 ISO Latin/ アラビア文字 ISO Latin/ ギリシャ文字 ISO Latin/ へプライ文字 ISO Latin-5( トルコ文字 ) ISO Latin-1 (JDK 1.1.6 以降 ) ISO Latin-2 (JDK 1.1.6 以降 ) ISO Latin-3 (JDK 1.1.6 以降 ) ISO Latin-4 (JDK 1.1.6 以降 ) ISO Latin/ キリル文字 (JDK 1.1.6 以降 ) ISO Latin/ アラビア文字 (JDK 1.1.6 以降 ) ISO Latin/äリシャ文字 (JDK 1.1.6 以降 ) ISO Latin / へプライ文字 (JDK 1.1.6 以降 ) ISO Latin-5 ( トルコ文字、 JDK 1.1.6 以降 ) キリル文字 (JDK 1.1.1 以降 ) ーディング (2)—CJK 工ンコーディング名 Big5 CNS11643 EUC-TW GB2312 GBK EUC-CN IS02022CN IS02022CN-GB IS02022CN-CNS EUCJIS EUC-JP SJIS JIS IS02022JP JIS0201 JIS0208 JIS0212 JISAutoDetect KSC5601 EUC-KR IS02022KR 文合 Big-5 CNS 11643 CNS 11643 GB 2312 GB 2312 GB 2312 ISO-2022-CN CN-GB ()B 2312 ) ISO-2022-CN (CNS 11643 ) JIS X 0208 JIS X 0208 JIS X 0208 JIS X 0208 JIS X 0208 KS C 5601 KS C 5601 JIS X 0208 JIS X 0212 JIS X 0208 JIS X 0201 ISO ー 2022 ー KR 意味 中国語 ( 台湾 ) 繁体字 中国語 ( 台湾 ) 繁体字 中国語 ( 台湾 ) 繁本 EUC (JDK 1.1.6 以降 ) 中国語簡体 中国語簡体ネ (JDK 1.1.4 以降 ) 中国語簡体字 : EUC (JDK 1.1.6 以降 ) 中国語 ( 台湾 ) 繁体字 (Unicode への変換のみ。 JDK 1.1.4 以降 ) 中国語簡体ネ (Unicode からの変換のみ。 JDK 1.1.4 以降 ) 中国語 ( 台湾 ) 繁本ネ (Unicode からの変換のみ。 JDK 1.1.4 以降 ) 日本語 EUC 日本語 EUC (JDK 1.1.6 以降 ) 日本語 Shift-JIS ()C と Windows 向け ) 日本語 JIS 日本語 JIS (JDK 1.1.6 以降 ) 日本語 JIS X 0201 (JDK 1.1.6 以降 ) 日本語 JIS X 0208 (JDK 1.1.6 以降 ) 日本語 JIS X 0212 (JDK 1.1.6 以降 ) 日本語 JIS/Shift-JIS/ 日本語 EUC の自動用捌 (Unicode への変換のみ。 JDKI. 1.1 以降 ) 韓国語ハングル 韓国語ハングル EUC(JDK 1.1.6 以降 ) 韓国語ハングル (JDK 1.1.4 以降 ) 文字工ンコーディング (3)—PC 、 Windows 、 IBM 鏈 工ンコーディング名コード′く一ジ CP037 CP273 68 CP 037 CP 273 意味 米対、カナダ、 IBM ドイツ語 ポルトガル、 フ・ラジノレ、 オーストリア UNIX MAGAZINE 1998.4