Ticket #30167

ISO-2022-JP-3(JIS X 0213)からUTF-8への変換

Open Date: 2012-11-21 20:50 Last Update: 2012-11-22 16:44

Reporter:
Owner:
(None)
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
1

Details

  • euc-jisx0213等とUnicode間の変換に対応するためのパッチです。
ISO-2022-JP-2(JIS X 0212)とISO-2022-JP-2004(JIS X 0213)が混在するファイルを、 UTF-8に変換しようとしたところ、nkfやiconvでは変換できなかったため、 Emacsで変換する羽目になったので。
  • BMP外の文字にも対応。 utf8tbl.c内の配列に入れるため、サロゲートペアとして持つようにしています。
  • 結合文字対応。 JIS X 0213の文字を表現するのに、 Unicodeでは結合文字を使う必要のある25文字にも対応。
    • ただし一部文字はeuc-jisx0213->unicode->euc-jisx0213変換すると元に戻りません (Linuxのiconvと同様)。
           euc-jisx0213             Unicode       euc-jisx0213
            ABE0( ̄|) ABE4(_|) -> U+02E5 U+02E9 -> ABE6
                      ABE6(\|) -> U+02E5 U+02E9 -> ABE6
      
      (結合回避のため幅なしスペース(U+200C)を入れる方法(kterm-6.2.0.ext06と同様)も 試したのですが、iconv -f utf-8 -t euc-jisx0213で変換できなくなるのでrevert)
  • -Z4や-Xにおいて、JIS X 0213で追加された半濁点付き文字に対応
  • 実装に関して
    • euc_to_utf8_XXXやutf8_to_euc_XXX配列は、jisx0213用に別の配列を追加。 一部でJIS X 0213と既存の機種依存文字の定義がぶつかるので。 JIS X 0213とUnicode間の変換表は、http://x0213.org/codetable/ のものを使用。
    • 入力や出力エンコーディングとして、明示的に--ic=euc-jisx0213等が指定されて、 x0213_fがTRUEになった場合のみjisx0213関係の処理を行うようにしています。 (jisx0213を自動認識して有効化はしない)
    • 作業履歴は以下(履歴の整理は多少しましたが、試行錯誤履歴もだいぶ残っています) http://sourceforge.jp/users/deton/pf/nkf_jisx0213utf8/scm/commits?branch=jisx0213-utf8
  • その他少し気になる点
    • ISO-2022-JP-2004出力時に、JIS X 0208の範囲はESC$Bで出力するようにしたい (ISO-2022-JP-3-strict等のように)
    • UTF-8からeuc-jisx0213への変換時、jisx0212の文字が削除される。 (例: cb9a, ce86, d082, ...) --cp932invを指定すれば回避は可能。 原因: 一度e2s_conv()でsjisに変換しているため、 x0212_shiftjisに無い文字が削除される。 仕様上は削除で問題ないが、せっかく0212と共存可能なのでなるべく残したい気も。 ただ、iconvで扱えなくなるので残しても困るかも。
    • jisx0213の判別
      • ISO-2022-JPでも、guessでESC$(O等を考慮したい
      • shift_jisx0213がguessするとBINARYになる
    • x0213_fの自動オン 現状は明示的に--icか--ocを指定する必要あり。
      • euc-jis-2004とguessしても、x0213_fはtrueにならないので、 一部文字が正しく変換されない。--ic=euc-jis-2004を指定する必要あり。
      • ESC $(OやQ,Pでx0213_fをTRUEにしたい。でもESC$(Dでx0212_fを設定してないし。
    • 通常のカタカナの後の合成用濁点や半濁点を、euc-jp等への変換時に合成する? NFC。 結局、utf8mac-inputと同じことを作ることになるし、x0213特有の話でもないし。 Unicodeからiso-2022-jp系への変換は、内部でNFC化してから行うようにする? (入力がutf-8の場合は、--utf8mac-inputを指定すればnfc変換は入るが、 utf-16等の場合は指定してもnfc変換されない。)
    • 機種依存文字を、x0213にマップ。cp932->euc-jisx0213変換時等。cp932inv等と同様? cp932で読み込んで、x0213で出力する必要があるので、 x0213フラグを読み込みと出力時で切り替える必要あり。 現状は、cp932の範囲でx0213とぶつかる文字はx0213とみなしてしまう。 一度unicodeを経由して変換する使い方で対応可能?(nkf -w|nkf --oc=euc-jisx0213)
    • iso-2022-jp-2対応(とりあえずはiso-2022-jp-1のエイリアス?) (Linuxのiconvはiso-2022-jp-1非対応でiso-2022-jp-2対応のため混乱するので)

Ticket History (3/3 Histories)

2012-11-21 20:50 Updated by: deton
  • New Ticket "ISO-2022-JP-3(JIS X 0213)からUTF-8への変換" created
2012-11-22 16:44 Updated by: naruse
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2012-11-22 16:44
Comment

おぉ、力作ですね。 ちょっと気にならないでもないですが、既存部分にはあまり影響なさそうなので、 cdb2fdaa5e74f844a06461ec9c151af186382a40 でマージしました。

Attachment File List

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login