Jis から Shift-JIS


すえ太郎  2004-01-13 11:18:14  No: 111246  IP: [192.*.*.*]

お世話になります。
Jisコード  から  Shift-JISへ相互変換したいのですが、
どの様にすればよいのでしょうか?
API関数などはないのでしょうか?

編集 削除
mady  2004-01-13 11:36:37  No: 111247  IP: [192.*.*.*]

http://www.unixuser.org/~euske/doc/kanjicode/

ここが参考になります。
ここをみながら作れば相互変換プログラムを作れます。

実はぼくも先週やろうと思っていて、少し作りました。
エスケープシーケンス処理の部分の作りこみがまだなので、
まだ、公開するのはやめておこうと思いますが。

APIは…知りません。あるかもしれませんが。
DLLだったらあると思います。
でも、是非作りこみをしてほしいですね。
最初は難しく感じると思いますが、
でも、作ってしまうと意外と簡単ですよ。
アルゴリズムの勉強にもなりますし。

では。

編集 削除
魔界の仮面弁士  2004-01-13 12:35:26  No: 111248  IP: [192.*.*.*]

VB6の場合は、ADODB.Streamオブジェクトを利用できます。(Charsetプロパティ)

Shift_JIS と JIS(iso-2022-jp) の変換だけではなく、
EUC-JP や UTF-8 など、各種文字コードの変換が可能ですよ。

例えば、VB6の場合は、[AcitveX Data Objects]のVer 2.5以上を参照設定して、

    Dim Stm As ADODB.Stream

    'JISコードのストリームを作成
    Set Stm = New ADODB.Stream
    Stm.Open
    Stm.Type = adTypeText
    Stm.Charset = "iso-2022-jp" 'あるいは"Shift_JIS"や"EUC-JP"とか

    '文字列を格納
    Stm.WriteText "弁士"

    'JISコードのバイナリとして取得
    Dim B() As Byte
    Stm.Position = 0
    B = Stm.ReadText()

    'ストリームの破棄
    Stm.Close
    Set Stm = Nothing

という感じです。メモリ上で変換するだけではなく、
ファイルからの読み込み、あるいはファイルへの書き出しもできます。

また、.NETの場合は、System.Text.Encodingクラスを使う事ができます。
(こちらは、SDKに使用例があるので、そちらを参考にして下さい)


なお、APIで処理するならば、mlang.dll を利用できます。
関数名でいえば、ConvertINetUnicodeToMultiByte とか、
ConvertINetString とか、ConvertINetMultiByteToUnicode ですね。

あるいは、kernel32.dll に含まれる、WideCharToMultiByte APIや
MultiByteToWideChar APIを使うこともできるでしょう。

編集 削除
魔界の仮面弁士  2004-01-13 12:42:24  No: 111249  IP: [192.*.*.*]

訂正……。

>    'JISコードのバイナリとして取得
>    Dim B() As Byte
>    Stm.Position = 0
>    B = Stm.ReadText()

上記は、
    'JISコードのバイナリとして取得
    Dim B() As Byte
    Stm.Position = 0
    Stm.Type = adTypeBinary
    B = Stm.Read()
として下さい。m(_ _)m


なお上記のサンプル(String→コード変換したバイト配列)とは逆に、
バイナリ(バイト配列)→Stringへの変換を行いたい場合には、
    Set Stm = New ADODB.Stream
    Stm.Open
    Stm.Type = adTypeBinary
    Stm.Write B     'ストリームに、バイトデータを書き込む

    Stm.Position = 0
    Stm.Type = adTypeText
    Stm.Charset = "iso-2022-jp" 'バイトデータの文字コードを指定
    S = Stm.ReadText()   'String型のデータとして取り出す
のようにすればOKです。

編集 削除
mady  2004-01-13 15:34:20  No: 111250  IP: [192.*.*.*]

すげー…
魔界の仮面弁士さん、さすがですね。
知っている者と知らない者の力の差が歴然です…

失礼しました。

編集 削除