MIRACLE

メールサービス申込 ユーザー登録&ログイン パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

テクノロジー情報



Samba 国際化プロジェクト > iconvについて

iconvについて

Sambaでは 3.0から、文字コード変換にiconvを使用するようになりました。
このページではそのiconvについてまとめてみました。


目次

2. libiconv/glibc の問題点
2-1. cp932 の問題点
2-2. JIS系エンコーディングの問題
2-3. cp932とeuc-jp,iso-2022-jp
3. libiconv/glibc パッチの内容
3-1. libiconv パッチでの修正内容
3-2. glibc パッチでの修正内容

1. 概要

オープンソースソフトウェアおよびフリーソフトウェアにおいてもソフトウェアの 国際化対応を行うために文字列処理の際に UCS(Unicode) を使う事が多くなってき ています。

UCS を用いる主な理由としては、各国のエンコーディングを考慮したコードを書か なくてもプログラム内部では UCS で処理して入出力の際にエンコーディング変換 を行えば良いという考えがあるようです。

UCS と各エンコーディングの変換を行う関数として iconv() がありますが、オー プンソースソフトウェアやフリーソフトウェアで利用されている libiconv や glibc2 での iconv() の実装では日本語での利用が実用にならないという問題があ ります。

この問題に対して各ソフトウェアの日本のコミュニティーが個別に対応していると いうのが現状で、必ずしも包括的な解決策がとられているわけではありません。

この文書は、glibc/libiconv の iconv() によるエンコーディング変換で日本語を 扱う際にどのような問題があるかを取り上げ iconv() を用いた日本語処理の問題 を共有する事を目的とします。

また、問題となるマルチバイト文字の一覧を用意しました。以下のリンクからダウンロードすることができます。

(注) 機種依存文字を含みます。

ダウンロード:

   iconv_memo.txt  CP932のtxt (2003/12/19)

   iconv_memo.doc  Wordのdoc形式 (2003/12/19)

2. libiconv/glibc の問題点


2-1. cp932 の問題点

libiconv/glibc には、Windows コードページ 932 と UCS(Unicode) のエンコーディング変換を行うコンバーターとして cp932 が用意されていますが、次の点がマイクロソフトの変換と異なります。

  1. JIS X 0208 で定義されている文字のうち表1 に示す文字の UCS との対応付けが異なる。

    表1
    文字 シフトJIS(区-点) UCS(Unicode)
    libiconv/glibc MS
    0x8160(01-33) U+301C U+FF5E
    0x8161(01-34) U+2016 U+2225
    0x817C(01-61) U+2212 U+FF0D
    ¢ 0x8191(01-81) U+00A2 U+FFE0
    £ 0x8192(01-82) U+00A3 U+FFE1
    ¬ 0x81CA(02-44) U+00AC U+FFE2

  2. JIS X 0201 で定義されている文字のうち表2 に示す文字の UCS との対応付けがが異なる。(glibc のみ)

    表2
    文字 シフトJIS UCS(Unicode)
    glibc MS
    \ 0x5C(5/12) U+00A5 U+005C
    ~ 0x7E(7/14) U+203E U+007E

  3. 表3 の文字が UCS からシフト JIS符号化 (cp932) への変換でマイクロソフトのものと異なる。(libiconv のみ。glibc ではベンダ依存文字は扱えない。)

    表3
    文字 UCS シフトJIS
    libiconv MS
    ローマ数字 U+2160 0xFA4A 0x8754
    ローマ数字 U+2161 0xFA4B 0x8755
    ローマ数字 U+2162 0xFA4C 0x8756
    ローマ数字 U+2163 0xFA4D 0x8757
    ローマ数字 U+2164 0xFA4E 0x8758
    ローマ数字 U+2165 0xFA4F 0x8759
    ローマ数字 U+2166 0xFA50 0x875A
    ローマ数字 U+2167 0xFA51 0x875B
    ローマ数字 U+2168 0xFA52 0x875C
    ローマ数字 U+2169 0xFA53 0x875D
    No. U+2116 0xFA59 0x8782
    Tel U+2121 0xFA5A 0x8784
    (株) U+3231 0xFA58 0x878A

1.、2. の違いにより、Windows で Unicode に変換したデータがオリジナルのlibiconv で正しく変換できず、また、libiconv で Unicode に変換したデータがWindows で正しく変換できないという問題が生じます。

3. の違いにより、シフトJIS(cp932)で重複符号化されている文字の同一視していないソフトでの文字列比較で問題が生じる可能性があります。
見た目は同じ文字でコードポイントの違いにより文字列比較で不一致となるケースになる為、注意が必要です。


2-2. JIS系エンコーディングの問題

libiconv/glibc の Shift_JIS/EUC-JP/ISO-2022-JP の各エンコーディングの変換は次の問題により限定なものになってしまっています。

  1. JIS X 0201 ラテン文字と UCS との変換、および US-ASCII とUCSとの変換に関して次のような違いがあります。

    表4
    文字 JISX0201
    US-ASCII
    UCS(Unicode)
    JISX0201 US-ASCII
    \ 0x5C(5/12) U+00A5 U+005C
    ~ 0x7E(7/14) U+203E U+007E

    この違いにより、JIS X 0201 ラテン文字を採用する Shift_JIS と、US-ASCII を採用する EUC-JP もしくは ISO-2022-JP との相互変換で、\ (0x5C) および ~(0x7E) を Shift_JIS に変換できないという問題があります。

  2. JIS X 0208 1区29点と UCS との対応付けに関して表5 に示すように JIS規格と異なります。

    表5
    文字 JIS X 0208
    区-点
    UCS(Unicode)
    libiconv/glibc JIS規格
    01-29 U+2015 U+2014


2-3. cp932とeuc-jp,iso-2022-jp

libiconv/glibc では、表1の libiconv/glibc の欄の UCS のコードポイントを採用する事で cp932 と euc-jp や iso-2022-jp との相互変換を実現する事が出来ていますがマイクロソフトの UCS との互換性がありません。

cp932 の変換をマイクロソフトの変換にあわせると、今度は、euc-jp や iso-2022-jpとの相互変換が出来なくなります。

UCS 経由でのエンコーディング変換の際には、各コンバーター間で中継する UCS のコードポイントが一致している必要があります。
よって、cp932 をマイクロソフトの変換にあわせる修正を行った場合は、Shift_JIS 符号化方式のコンバーターに sjis と cp932の 2 種類が存在するように、euc-jp、iso-2022-jp にもマイクロソフトの UCS を採用するコンバーターが別途必要と思わ れます。

表6 JISのUCSマッピングとMSのUCSマッピングの相違点
文字 区-点 UCS(Unicode)
JIS規格 NS
01-29 U+2014 U+2015
01-33 U+301C U+FF5E
01-34 U+2016 U+2225
01-61 U+2212 U+FF0D
¢ 01-81 U+00A2 U+FFE0
£ 01-82 U+00A3 U+FFE1
¬ 02-44 U+00AC U+FFE2

表7 各符号化方式に対応する iconv() でのコンバータ (codeset 名)
  JISのUCSマッピング MSのUCSマッピング
シフトJIS符号化 sjis cp932
日本語EUC符号化 euc-jp (1)
ISO-2022-JP符号化 iso-2022-jp (2)

表7 の (1), (2) の部分は Windows では、それぞれ次のようなコードページで対応しています。

  1. コードページ 51932 (ユーザー定義文字を扱えない)
  2. コードページ 50220 (ユーザー定義文字を扱えない)
※ Windows では JISのUCSマッピングを用いた変換は用意されていません。

オープングループ/日本ベンダ協議会では、次のような codeset 名を定義しています。

  1. eucJP-ms (ユーザー定義文字を扱える)
  2. なし
※ eucJP-ms と Windows のコードページ 51932 は互換性がありません。

標準情報(TR) TR X 0015:1999 XML日本語プロファイル では次のような charset 名が定義されています。

  1. x-eucjp-open-19970715-ms (eucJP-ms ユーザー定義文字を扱える)
  2. x-iso2022jp-cp932 (ユーザー定義文字を扱えない)

3. libiconv/glibc パッチの内容


3-1. libiconv パッチでの修正内容

  1. cp932 の変換をマイクロソフトの Windows コードページ 932 と UCS との変換と同一になるように修正。

    libiconv 1.8 オリジナル
      cp932 → → Unicode → → cp932
    0x8160 U+301C 0x8160
    0x8161 U+2016 0x8161
    0x817C U+2212 0x817C
    ¢ 0x8191 U+00A2 0x8191
    £ 0x8192 U+00A3 0x8192
    ¬ 0x81CA U+00AC 0x81CA
      cp932 → → Unicode → → cp932
    ローマ数字1 0x8754 U+2160 0xFA4A
    ローマ数字2 0x8755 U+2161 0xFA4B
    ローマ数字3 0x8756 U+2162 0xFA4C
    ローマ数字4 0x8757 U+2163 0xFA4D
    ローマ数字5 0x8758 U+2164 0xFA4E
    ローマ数字6 0x8759 U+2165 0xFA4F
    ローマ数字7 0x875A U+2166 0xFA50
    ローマ数字8 0x875B U+2167 0xFA51
    ローマ数字9 0x875C U+2168 0xFA52
    ローマ数字10 0x875D U+2169 0xFA53
    No. 0x8782 U+2116 0xFA59
    Tel 0x8784 U+2121 0xFA5A
    (株) 0x878A U+3231 0xFA58
      cp932 → → Unicode → → cp932
    ローマ数字1 0xFA4A U+2160 0xFA4A
    ローマ数字2 0xFA4B U+2161 0xFA4B
    ローマ数字3 0xFA4C U+2162 0xFA4C
    ローマ数字4 0xFA4D U+2163 0xFA4D
    ローマ数字5 0xFA4E U+2164 0xFA4E
    ローマ数字6 0xFA4F U+2165 0xFA4F
    ローマ数字7 0xFA50 U+2166 0xFA50
    ローマ数字8 0xFA51 U+2167 0xFA51
    ローマ数字9 0xFA52 U+2168 0xFA52
    ローマ数字10 0xFA53 U+2169 0xFA53
    No. 0xFA59 U+2116 0xFA59
    Tel 0xFA5A U+2121 0xFA5A
    (株) 0xFA58 U+3231 0xFA58

    libiconv 1.8 パッチ適用後
      cp932 → → Unicode → → cp932
    0x8160 U+FF5E 0x8160
    0x8161 U+2225 0x8161
    0x817C U+FF0D 0x817C
    ¢ 0x8191 U+FFE0 0x8191
    £ 0x8192 U+FFE1 0x8192
    ¬ 0x81CA U+FFE2 0x81CA
      cp932 → → Unicode → → cp932
    ローマ数字1 0x8754 U+2160 0x8754
    ローマ数字2 0x8755 U+2161 0x8755
    ローマ数字3 0x8756 U+2162 0x8756
    ローマ数字4 0x8757 U+2163 0x8757
    ローマ数字5 0x8758 U+2164 0x8758
    ローマ数字6 0x8759 U+2165 0x8759
    ローマ数字7 0x875A U+2166 0x875A
    ローマ数字8 0x875B U+2167 0x875B
    ローマ数字9 0x875C U+2168 0x875C
    ローマ数字10 0x875D U+2169 0x875D
    No. 0x8782 U+2116 0x8782
    Tel 0x8784 U+2121 0x8784
    (株) 0x878A U+3231 0x878A
      cp932 → → Unicode → → cp932
    ローマ数字1 0xFA4A U+2160 0x8754
    ローマ数字2 0xFA4B U+2161 0x8755
    ローマ数字3 0xFA4C U+2162 0x8756
    ローマ数字4 0xFA4D U+2163 0x8757
    ローマ数字5 0xFA4E U+2164 0x8758
    ローマ数字6 0xFA4F U+2165 0x8759
    ローマ数字7 0xFA50 U+2166 0x875A
    ローマ数字8 0xFA51 U+2167 0x875B
    ローマ数字9 0xFA52 U+2168 0x875C
    ローマ数字10 0xFA53 U+2169 0x875D
    No. 0xFA59 U+2116 0x8782
    Tel 0xFA5A U+2121 0x8784
    (株) 0xFA58 U+3231 0x878A

    表の背景色が の文字の変換に関しては、以下のページと同一となるように修正
      PRB: Conversion Problem Between Shift-JIS and Unicode

  2. eucJP-ms の追加。

  3. cp932/eucJP-ms から iso-2022-jp に変換できるように、UCS から iso-2022-jp へのテーブルに cp932/eucJP-ms 独自の変換を追加。
    ※ libiconv 1.8 用パッチのみに追加。libiconv 1.9.1 用パッチには追加せず。

3-2. glibc パッチでの修正内容

  1. cp932 を sjis の別名ではなく、独立したものとして実装。変換はマイクロソフトの変換に合わせる。
  2. eucJP-ms の追加。

4. 課題

  1. sjis/euc-jp/iso-2022-jp の相互変換の実現

    2-2 JIS系コンバータの問題点 (1) の問題により、sjis/euc-jp/iso-2022-jp の相互変換が出来ない問題の解決

  2. cp932/eucJP-ms と相互変換可能な ISO-2022-JP コンバータ

    iso-2022-jp-ms もしくは iso-2022-jp-cp932 というような別名称で追加する

  3. Linux の NLS での変換

    Linux の NLS (National Language Support) で使用されている、cp932 およびeuc-jp は日本語版 Samba で行われている SJIS 正規化(重複符号化されている文字コードポイントの統合)と同じ処理が行われています。

    この正規化処理と、glibc/libiconv の UCS 経由での変換で行われる正規化と異なるという問題があります。

  4. iconv() を使わないソフトとの互換性

    iconv() を使わないで独自にエンコーディング変換を実装しているソフトでも、eucJP-open (eucJP-ms) の変換をサポートしているソフトがあります。
    例えば、PHP の eucJP-win や PostgreSQL の EUC_JP などです。

    ソフトウェア毎に名称が違っている事や、各ソフトでベンダ依存文字に対応するために個別に対応してきたという経緯があり、必ずしもソフトウェア間での互換性が十分に確認されていないものと思われます。

    cp932/eucJP-ms に関しては、正確な変換表を1つ用意して、それを用いて実装を行うという事が必要と考えています。

  5. eucJP-ms のロケール名

    JF ドキュメント > Linux における日本語ロケールに関する指針 > Chapter 3. 文字コード
      http://www.linux.or.jp/JF/JFdocs/Japanese-Locale-Policy/character-code.html

    の「補足」によると、「また他の環境との互換性のため外字を必要とする場合には ja_JP.eucJP ではなく別の名前を使用することが望ましい。」とあり、新たなロケール名称の定義が必要と思われます。

5. 参考


   JIS規格
  JIS X 0201
  JIS X 0208
  JIS X 0221

   WWW

変換表がベンダーによって異なる (2002-04-04)
http://www.debian.or.jp/~kubota/unicode-symbols-map2.html.ja

Java Character Encodings > 既存の文字コードを処理する際の問題点
http://www.ingrid.org/java/i18n/encoding/

Troll Tech と交渉して Qt/KDE の国際化/日本語化をした方のページ
http://www.asahi-net.or.jp/~hc3j-tkg/

従来の文字コードとUnicodeの対応に関する諸問題
http://euc.jp/i18n/ucsnote.ja.html

(eucjp-ms) Unicode とユーザ定義文字・ベンダ定義文字に関する問題点と解決策


JIS-Unicode変換において問題の起こりにくい変換表
http://hp.vector.co.jp/authors/VA010341/unicode/

   以下は、森山作成のページ



会社情報 採用情報 個人情報保護方針 情報セキュリティ基本方針 商標等取り扱い事項 English
Copyright(c)2000-2015 MIRACLE LINUX CORPORATION. All Rights Reserved.