VB上で漢字を含む文字をJISコードに変換するには?

解決


けい  2005-11-28 06:27:58  No: 92942

VB上で、漢字を含む文字をJISコード(16進数)に変換するプログラムを作りたいのですが、どなたか教えてもらえませんか?

(例)Text1に「亜」を入力  →変換→  Text2に「3021」が出力

http://madia.world.coocan.jp/vb/vb_bbs2/200401_04010054.html
ちなみに過去ログを検索して、上のページの魔界の仮面弁士さんの方法を試したのですが、ソースをコピペして最後に「Text1 = B」を付けて実行したのですが、Text1の結果は「?????」でした。どうしてでしょうか?他にも方法があれば教えてほしいです。

皆様のご助言を頂きたいです。宜しくお願い致します。  m(_  _)m
(魔界の仮面弁士様へ、勝手に引用して申し訳ありません。)


魔界の仮面弁士  2005-11-28 06:40:41  No: 92943

VB6の文字コードは、Unicode (UTF-16) で表されています。
JISのバイナリを渡せば、化けて表示されるのも当然でしょう。

16進数表記のデータが欲しいのであれば、そのサンプルの最後に
 Dim V As Variant
 For Each V In B
    Debug.Print Right("0" & Hex(V), 2)
 Next
などのようなコードを加えてみてください。


けい  2005-11-28 07:51:08  No: 92944

魔界の仮面弁士様!!即レスありがとうございます。できました。感謝です。

ずぅずぅしいのですが、もうひとつ教えてもらえないでしょうか?
逆にJIS(16進数表記)の文字データをUnicode の文字データにするときは、どうすればよいのでしょうか?(例)「1B244230211B2842」→「亜」

JIS(16進数表記)のデータを一度バイト型に格納してから変換しなければならないのでしょうか?その格納する方法もわからないです。教えてもらえないでしょうか?

わからないことばかりです。どうか宜しくお願いいたします。


ガッ  2005-11-28 08:18:54  No: 92945

横から失礼します。

とりあえず、16進表記→バイト配列の関数だけうpしておきます。
-VB6-
Public Function GetByteArray(ByVal codeString As String) As Byte()
    'codeString:JIS(16進数表記)の文字データ
    Dim i       As Long
    Dim sLen    As Long
    Dim buf()   As Byte
    
    sLen = Len(codeString) \ 2
    ReDim buf(1 To sLen)
    For i = 1 To sLen
        buf(i) = Val("&h" & Mid$(codeString, (i - 1) * 2 + 1, 2))
    Next
    
    GetByteArray = buf
    
End Function

※「1B244230211B2842」→「亜」
  これって…エンコード形式分からないんだけど…何だろう…


魔界の仮面弁士  2005-11-28 11:36:24  No: 92946

> 横から失礼します。
後ろから失礼します。(ぉぃ

ガッさんの作成された関数と同じ機能ですが、こんな書き方もあります。

Function GetByteArray(ByVal HexText As String) As Byte()
    With CreateObject("Microsoft.XMLDOM").createElement("tmp")
        .DataType = "bin.hex"
        .Text = HexText
        GetByteArray = .NodeTypedValue
    End With
End Function

> これって…エンコード形式分からないんだけど…何だろう…
最初に JIS とか書かれていたので、iso-2022-jp でしょう。

Const adTypeBinary = 1
Const adTypeText = 2
With CreateObject("ADODB.Stream")
    .Open
    .Type = adTypeBinary
    .Write GetByteArray("1B244230211B2842")
    .Position = 0
    .Type = adTypeText
    .Charset = "iso-2022-jp"    '_autodetect でも可
    Text1.Text = .ReadText()
    .Close
End With


ガッ  2005-11-28 19:55:56  No: 92947

> 魔界の仮面弁士さん
失礼されました(ぇ

> ガッさんの作成された関数と同じ機能ですが、こんな書き方もあります。
…そんな方法があったとは…
(XMLでバイナリ扱うときに使う…みたい)

> > これって…エンコード形式分からないんだけど…何だろう…
> 最初に JIS とか書かれていたので、iso-2022-jp でしょう。
普通にShift_JISかと思ってました(orz


けい  2005-11-29 05:54:06  No: 92948

おかげさまで解決できました!!!
魔界の仮面弁士様、ガッ様。大大大感謝です!
(ちなみにJISです。言葉足らずでスマソ!)

お二方の構文を見てると、もはや宇宙語のように見えます。(^^;)
こんな難問をスラスラ解けるなんて、すごぉいです!きっとお二方にとっては、こんなのは難問とは言わないんでしょうね。僕も頑張って勉強します。本当にありがとうございました。。。(^o^)//


けい  2005-11-29 05:54:07  No: 92949

おかげさまで解決できました!!!
魔界の仮面弁士様、ガッ様。大大大感謝です!
(ちなみにJISです。言葉足らずでスマソ!)

お二方の構文を見てると、もはや宇宙語のように見えます。(^^;)
こんな難問をスラスラ解けるなんて、すごぉいです!きっとお二方にとっては、こんなのは難問とは言わないんでしょうね。僕も頑張って勉強します。本当にありがとうございました。。。(^o^)//


ガッ  2005-11-29 06:06:51  No: 92950

ありがとうございます。(何もしてないけど言われると嬉しいなぁ)

↓について調べてみました。
> > 最初に JIS とか書かれていたので、iso-2022-jp でしょう。
> 普通にShift_JISかと思ってました(orz
"制御コード"という単語を思い出すだけで時間かかってしまいまして、
分かればなんてことはないですね。
・1B 24 42
  で JIS X 0208 に切り替え
・1B 28 42
  で ASCII に切り替え
らしいです。

参照:
http://x68000.q-e-d.net/~68user/webcgi/char-code-1.html


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

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






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