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
BOMが邪魔してるとか
http://d.hatena.ne.jp/Fio/20060808/wsh
> 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 で保存し、
実行してみましょう。