[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

とーりすがり

  • 自分のメモ書きとして使えるかな?
  • pukiwikiになれているので、このwikiの使い方がいまいちわからない。

SJIS <-> UTF-8 サンプル & 解説

//chrに代入されているShift-JISの文字列をUTF-8に変換します。

#include "llmod.as"
a= 64
b= 64
sdim chr, a
sdim tmp, b

chr= "SJISからUTF8"
//*
//notesel chr
//noteload "0.txt"
//dialog chr

prm= 0, 0, 0, -1,  0, b
getptr prm.2, chr
getptr prm.4, tmp
dllproc "MultiByteToWideChar", prm, 6, D_KERNEL

prm= 65001 , 0, 0, -1, 0, a, 0, 0
getptr prm.2, tmp
getptr prm.4, chr
dllproc "WideCharToMultiByte", prm, 8, D_KERNEL

notesel chr

notesave "0.txt"
//*
//notesave "1.txt"
  • 全体的な流れ
 1.MultiByteToWideCharを呼ぶ->2.WideCharToMultiByteを呼ぶ。

これは SJIS -> UTF-8 であろうと、 UTF-8 ->SJIS であろうと同じです。
*1と2の順番を変えたりしないように注意。

上のサンプルを実際に動かし、0.txtをHSPエディタとかで開くと、
"SJISからUTF8" という文字列が UTF-8 に変換されているため
"SJIS縺九iUTF8"
という風に化けて見えます。 次に メモ帳(XP以上のメモ帳。XP以前のOSは、Terapadとか)で開くと "SJISからUTF8" と見えるはずです。
以上がサンプルの概要です。

  • MultiByteToWideChar(文字列をワイド文字列Unicodeに変換)のオプション
    上のサンプルでは prm= 0, 0, 0, -1, 0, b となっています。
    この配列の一番左(=prm.0)の値が以下のオプションになっています。
    //0 (CP_ACP)    ANSI コードページ
    //1 (CP_OEMCP)  OEM コードページ
    //2 (CP_MACCP)  Macintosh コードページ
    //3 (CP_THREAD_ACP)     Windows 2000/XP: 呼び出しスレッドの ANSI コードページ
    //42 (CP_SYMBOL)        Windows 2000/XP: シンボルコードページ
    //65000 (CP_UTF7)       Windows 98/Me/NT 4.0 以降: UTF-7 を使用して変換
    //65001 (CP_UTF8)       Windows 98/Me/NT 4.0 以降: UTF-8 を使用して変換
    
  • WideCharToMultiByte(Win32環境でUnicode文字列をMultiByte文字列(通常の文字列)に変換)のオプション
    上のサンプルでは prm= 65001 , 0, 0, -1, 0, a, 0, 0 となっています。
    この配列の一番左(=prm.0)の値が以下のオプションになっています。
    //0 (CP_ACP)    ANSI コードページ
    //1 (CP_OEMCP)  OEM コードページ
    //2 (CP_MACCP)  Macintosh コードページ
    //3 (CP_THREAD_ACP)     Windows 2000/XP: 呼び出しスレッドの ANSI コードページ
    //42 (CP_SYMBOL)        Windows 2000/XP: シンボルコードページ
    //65000 (CP_UTF7)       Windows 98/Me/NT 4.0 以降: UTF-7 を使用して変換
    //65001 (CP_UTF8)       Windows 98/Me/NT 4.0 以降: UTF-8 を使用して変換
    

上記の2つのAPI関数のリストを見て
1.MultiByteToWideCharを呼ぶ->2.WideCharToMultiByteを呼ぶ。
という流れと照らし合わせると、上記サンプルではMultiByteToWideCharでオプションを0(=ANSI),WideCharToMultiByteではオプションを65001(=CP_UTF8)としていることがわかります。
UTF-8 -> SJIS のやり方が少し見えてきましたか?

UTF-8 -> SJIS にするには

結論から言うと上のサンプルでは、
1.変数chrにUTF-8の文字列を読み込ませ、MultiByteToWideCharのオプション prm.0 を65001 (CP_UTF8)にします。
2.WideCharToMultiByteのオプション prm.0 を0 (CP_ACP)にします。

要するに MultiByteToWideChar では読み込ませる文字コードを教えてあげて、WideCharToMultiByte では変換したい文字コードを指定すればいいわけです!

上のサンプルの便利な使い方。
一度そのまま実行します。UTF-8で書かれた0.txtができます。
chr= "SJISからUTF8" をコメントアウトし、すぐ下の//*以下のコメントをはずします。notesave "0.txt" もコメントアウトし、すぐ下の//*以下のコメントをはずします。"UTF-8 -> SJIS にするには"の手順に従ってそれぞれのprm.0を65001と0にします。 実行します。

これで SJIS -> UTF-8 , UTF-8 -> SJIS を実際に試すことができました。

資料を探すにあたって以下のソフトウェア、書き込み、サイトを参考にしました。
xiさん ChopSticks 1.1、HSP BBS 過去ログ 04/07/17 イドさん、ちょくとさん "Win32 API関数リスト"

httpクライアントサンプル