EUCコードからShift-JISコードに変換するには?


Junix  2004-03-03 03:48:37  No: 53256

EUCコードからShift-JISコードに変換するにはどうすればよいでしょうか?
ご教授お願いいたします。


YuO  2004-03-03 04:15:47  No: 53257

> EUCコードからShift-JISコードに変換するにはどうすればよいでしょうか?

完全な変換方法はありません。
#ASCIIとJIS X 0201は異なるし,JIS X 0212をShift_JISはサポートしていない。

厳密な変換を望まず,処理系依存してもよいのであれば,_mbcjistojmsを利用することができます。
http://msdn.microsoft.com/library/en-us/vclib/html/_crt__mbcjistojms.2c_._mbcjmstojis.asp
JIS X 0208の文字と0x7F7Fの論理積を与えれば,Shift JISでのJIS X 0208の文字に変換されます。

処理系への依存を押さえたいのであれば,自分で作るか,
International Components for Unicode(ICU)に頼ることになります。
http://oss.software.ibm.com/icu/
euc-jpからshift_jisへの変換の為だけにICUを使うのは,大がかりすぎる気もしますが。


Toshi  2004-03-04 00:00:42  No: 53258

EUC -> SJIS は大抵、変換テーブルを用意してコンバートする事が多いです。

結論から言っちゃうと、
http://www.net.is.uec.ac.jp/~ueno/material/kanji/euc2sjis.html

分かりやすい解説は
http://www.opengroup.or.jp/jvc/cde/sjis-euc.html

辺りどうでしょ?


Toshi  2004-03-04 05:27:14  No: 53259

To: YuOさん

ちょっと突っ込ませて下さい。

_mbcjistojms() は JIS→SJISですよね?
>JIS X 0208の文字と0x7F7Fの論理積を与えれば,Shift JISでのJIS X 0208の文字に変換されます。

この二つの情報で、どうやってEUC→SJISが実現出来るのかイマイチ理解出来ませんでした。


YuO  2004-03-04 08:48:27  No: 53260

> EUC -> SJIS は大抵、変換テーブルを用意してコンバートする事が多いです。

そんなことをするのはメモリの無駄遣いになることが多いです。
そもそも,どちらもJIS X 0208の文字の順序を変換せずに使っているので,
計算だけで処理することができます。

ちなみに,アセンブラで昔書いたコードを引っぱり出すと,
    and ax, 7F7FH
    shr ah, 1
    jc  L1
    add al, 5EH
    dec ah
L1: sub al, 60H
    sbb al, 0
    sub ah, 2FH
    jc  L2
    add ah, 40H
L2: add ah, 0A0H
    add al, 80H
でAXレジスタの値がEUC-JPのJIS X 0208の文字の値からShift_JISのJIS X 0208の値に変換されます。

> _mbcjistojms() は JIS→SJISですよね?
>> JIS X 0208の文字と0x7F7Fの論理積を与えれば,Shift JISでのJIS X 0208の文字に変換されます。
> この二つの情報で、どうやってEUC→SJISが実現出来るのかイマイチ理解出来ませんでした。

EUC-JPの仕組みを知れば簡単だと思いますが……。

まず,EUC-JPはISO/IEC 2022の8bit系の枠組みを利用しています。
そして,C0とC1にISO/IEC 6429を,
G0にUS-ASCII(or ISO/IEC 646国際基準版)を,G1にJIS X 0208を,G2にJIS X 0201の片仮名用図形文字集合を,G3にJIS X 0212を,
それぞれ呼び出した状態にあり,さらに
CLにはC0が,CRにはC1が,GLにはG0が,GRにはG1が,
それぞれ指示されている状態が暗黙に指示されています。
そして,G2とG3はシングルシフトを使って利用し,エスケープシーケンス及びロッキングシフトは利用しません。

以上がEUC-JPの基本的な仕組みです。

そして,JIS X 0208の文字はGRにあるので,10/01〜15/14の範囲のコードになります。
また,_mbcjistojmsはGLにあるJIS X 0208の文字を変換します。
GRの文字というのは,GLの文字の各バイトと128の論理和になるので,
0x7F7Fとの論理積をとることによってGRの文字をGLの文字のごとく扱えます。
あとは,このコードを_mbcjistojmsにかければShift_JISにおけるコードなる,というものです。

ところで,「JIS」というエンコーディングは存在しません。
#JISに定められた,というのであれば複数存在する。
文字コードを扱うのですから,紛れのない表現を使って下さい。

参考資料)
文字コードの話 (euc.JP内)
http://euc.jp/i18n/charcode
日本語と文字コード (The Web KANZAKI内)
http://kanzaki.com/docs/jcode
CHARACTER SETS (IANA内)
http://www.iana.org/assignments/character-sets


Toshi  2004-03-05 00:28:03  No: 53261

To YuOさん

本題とずれますが、腹に据え兼ねてるので少々言わせて下さい。

>そんなことをするのはメモリの無駄遣いになることが多いです。
>文字コードを扱うのですから,紛れのない表現を使って下さい。

ん〜、ちょっとムッと来ました。余り人のフォローにいちゃもん付けるのはやめたほうが良いと思いますよ。
間違いを指摘する場合も言い方を考えましょうよ。

YuOさんが、どの様なプロジェクトで開発を行っているのか分かりませんが、私があのフォローを書いた経緯は下記によるものです。

・テーブルを用いた変換は事実多くの現場で使用されていて、実績が有ります。
・ここはVCの掲示板なので、Windows開発前提です。今更メモリ無駄使いを
  そこまで極端に気にする時代では有りません。(事実、実際メモリにシビアな
  携帯電話開発でもテーブル変換を採用している事が多いです)
・大抵のプロジェクトでは納期と予算に限りが有り、文字コード変換そのものが
  目的である場合を除き、文字コードの詳しい調査に費やす工数を得られません。
  また、YuOさんの示された様なロジカルなソースを入手出来たとしても、実績が
  無ければ検証の必要性が有りますし、それがロジカルで有れば有るほど、検証
  に費やす工数は膨らみます。

つまり、もっともお手軽に実現できる方法を示したまでです。

それと、これは進言ですが、YuOさんが知識豊富なのは認めますし、尊敬もします。
特に、MSDNの英語版を把握してるのは感心します。
しかし、大抵の開発者はYuOさんほどの知識や語学力を持ってませんし、それを求めるのも物理的、時間的に無理です。
(でもYuOさんは、ご自分の知識レベルを他人にも求めてる様に感じます。例えば
_mbcjistojmsの話は、各々のコード体系とISO 2202を理解してて初めて分かるお話ですし・・とは言え、きちんと参考文献リンクを張ってくれてる辺りはサスガだなと感じています。)
まぁ、この辺もケースバイケースだとは思いますが・・・さすがに、誰もが独自で学習経験するであろう、VCの基本的な使い方やAPIの使い方まで噛み砕いて書く気には私にもなれませんし・・・

>文字コードを扱うのですから,紛れのない表現を使って下さい。

JIS(コード)は通称ですので問題無いと思ってます。
実際、YuOさんが紹介された,_mbcjistojms()のMSDNでも単にJISって表現ですし、YuOさんが紹介された参考文献リンクのページにもその旨が記述されています。
文字コード変換を扱うシーンにて少なくとも私の周りでは、過去も含めて JISコードの事を「JIS X 0208をGLに呼び出した状態でのビット組み合わせ」とか「ISO 2022準拠の指示のエスケープシーケンスなどを用いるエンコーディング法」と言う人は皆無でしたし、エンコードを意識した会話も皆無でした。
なまじ、JIS X 0208とかISO 2022 とか見慣れない用語を使うのは時として混乱を招くだけだと思っています。
(恐らく質問者もそのレベルの解答を望んでいるのでは無いでしょう?)
昔の有名な言葉で「プログラマに必要なのは、どうしてテレビが映るのか、では無くどうやったらテレビが映るのか、と言う発想だ」と言うのが有りますが、取りあえずそれでいいと思ってます。
もっとも、テレビのスイッチが見つからなければ中身を解析して自前でスイッチを作る必要が有るシーンも有りますし、それなりの情報も必要になってくるでしょうが、その時はその時って事で。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加