UTF-8でE6 A0 ACの文字をVB6で印刷できるのか?


たかちゃん  2008-04-29 00:20:37  No: 139636  IP: 192.*.*.*

VB6で、UTF-8の文字コードE6 A0 AC(UnicodeではU+682C)(きへんに色という文字)をPrinterオブジェクトで印刷しようとして、Unicodeに変換したのですが、?と変換されてしまい印刷できません。
Dim byt(2) As Byte
Dim hogehoge As String

    byt(0) = &HE6
    byt(1) = &HA0
    byt(2) = &HAC
    hogehoge = ADOS_Decode_UTF8(byt)
    Printer.Print hogehoge
'------------------UTF-8からUnicodeへの変換メソッド
Public Function ADOS_Decode_UTF8(ByRef bytIn() As Byte) As String
    ADOS_Decode_UTF8 = ADOS_Decode("UTF-8", bytIn)
End Function

' 関数名    : ADOS_Decode
' 返り値    : UNICODE文字列
' 引き数    : cset  : 入力文字データのキャラクタセット名
'           : bytIn : 入力文字データ
' 機能説明  : 入力文字データをUNICODEに変換する
' 備考      :
Private Function ADOS_Decode(ByVal cset As String, ByRef bytIn() As Byte) As String
    On Error GoTo ErrHandler

    Dim objStm As ADODB.Stream
    Set objStm = New ADODB.Stream
    objStm.Open
    objStm.Type = adTypeBinary
    objStm.Write bytIn

    objStm.Position = 0
    objStm.Type = adTypeText
    objStm.Charset = cset
    ADOS_Decode = objStm.ReadText()

    objStm.Close
    Set objStm = Nothing

    Exit Function
ErrHandler:
    Debug.Print "文字コード変換エラー:" & Err.Description
    If objStm Is Nothing = False Then objStm.Close
    Set objStm = Nothing
End Function

編集 削除
やじゅ  2008-04-29 01:13:11  No: 139637  IP: 192.*.*.*

BOMが邪魔してるとか
http://d.hatena.ne.jp/Fio/20060808/wsh

編集 削除
魔界の仮面弁士  2008-04-29 02:12:14  No: 139638  IP: 192.*.*.*

> Printerオブジェクトで印刷しようとして、

Unicode 文字の印刷が必要なのであれば、
  (案1) Unicode 文字の印刷に対応したコンポーネントを購入する。
  (案2) Unicode 文字の印刷に対応したソフト(Word等)を利用する。
  (案3) Printer オブジェクトを使わず、すべて API で印字する。
  (案4) .NET に移行し、PrintDocument 等で出力する。
などの対応が求められるかと思いますよ。


> Unicodeに変換したのですが、
変換も何も、String 型は Unicode そのものですから、
  Dim S As String
  S = ChrW(&H682C)
とするだけですよね。


> ?と変換されてしまい印刷できません。

VB6 で使われる文字列型そのものは、Unicode として扱われていますし、
Left/Mid/Replace といった文字列処理関数も Unicode を正しく扱いますが、
VB6 の入出力関連の機能は、日本語版では Shift_JIS にしか対応していません。
Printer.Print も TextBox も Debug.Print も MsgBox も Print # も。

標準で Unicode に対応しているのは、DataGrid や ADODB など、ごく一部の
ActiveX コンポーネントだけです。
(DataGrid にしても、Win9x 系の環境では Unicode を利用できません)


蛇足ですが、VBScript は Unicode に対応しています。
『MsgBox ChrW(&H682C)』と書いたテキストを、拡張子 VBS で保存し、
実行してみましょう。

編集 削除