VB6 ESC/Pコードで日本語印字させるには


テンパリ  2011-05-17 11:49:36  No: 102906  IP: [192.*.*.*]

検索していたらこちらを見つけ質問させて頂いております
現在VB6で、あるイベントが発生すると
パラレルポート接続のラインプリンタ(EPSON  VP-4300)へESC/P  エスケープコードを送信して、日本語メッセージを印刷させるプログラムを開発しております。
"テストABC123"半角英数字はテキストのダイレクト入力で印字OKなのですが、
日本語漢字となると、漢字モードへ変更後、コード表から拾ったコードを手打ちで送信しています。
これだと手間がかかるので、任意の日本語を"てすとテスト亜意卯"、漢字コード(16進)へ変換することはできないでしょうか?

現在"てすと"と印刷させるために

Print #1, Chr$(36) + Chr$(70); Chr$(36) + Chr$(57); Chr$(36) + Chr$(72)
と入力しています

初心者で申し訳ございません、どなたかご教示願います。

編集 削除
魔界の仮面弁士  2011-05-17 17:08:50  No: 102907  IP: [192.*.*.*]

> Print #1, Chr$(36) + Chr$(70); Chr$(36) + Chr$(57); Chr$(36) + Chr$(72)
16 進数で表記すると、
 Print #1, Chr(&H24) & Chr(&H46); Chr(&H24) & Chr(&H39); Chr(&H24) & Chr(&H48)
ですね。これ自体は
 Print #1, "$F$9$H"
と同義です。


> 漢字コード(16進)へ変換することはできないでしょうか?
とりあえず、

    Dim bin() As Byte
    With CreateObject("ADODB.Stream")
        .Open

        .Type = 2   'text mode
        .Charset = "iso-2022-jp"    '文字コード指定
        .WriteText Text1.Text   '書き込み

        .Position = 0
        .Type = 1   'binary mode
        bin = .Read(-1) '読み込み

        .Close
    End With

のようにすると、"てすとテスト亜意卯" という文字列を
下記の 24 バイトのデータに変換できます。

1B 24 42 24 46 24 39 24 48 25 46 25 39 25 48 30 21 30 55 31 2C 1B 28 42


内訳としてはこんな感じ。

1B,24,42,     漢字モード
 24,46,     "て"  ($F)
 24,39,     "す"  ($9)
 24,48,     "と"  ($H)
 25,46,     "テ"  (%F)
 25,39,     "ス"  (%9)
 25,48,     "ト"  (%H)
 30,21,     "亜"  (0!)
 30,55,     "意"  (0U)
 31,2C,     "卯"  (1,)
1B,28,42,     ASCIIモード


漢字ひらがな限定など、途中でASCII との切り替えが発生しない事が保証される場合は、
内容検証無しで、前後3バイトずつを切り捨ててしまっても良いかも。

    Dim bin() As Byte
    With CreateObject("ADODB.Stream")
        .Open

        .Type = 2   'text mode
        .Charset = "iso-2022-jp"    '文字コード指定
        .WriteText "てすとテスト亜意卯"  '書き込み

        .Position = 0
        .Type = 1   'binary mode

        .Position = .Size - 3
        .SetEOS     '最後の3バイトを破棄

        .Position = 3   '先頭3バイトを読み捨てて
        bin = .Read(-1) '残りを取得

        .Close
    End With

    ' s = "$F$9$H%F%9%H0!0U1,"
    Dim s As String
    s = StrConv(bin, vbUnicode, 1041)

    Print #1, s

編集 削除
テンパリ  2011-05-17 22:45:39  No: 102908  IP: [192.*.*.*]

魔界の仮面弁士さま
早速のフォロー有難う御座います!

> Print #1, "$F$9$H"
>と同義です。
なるほど、私がやっていたのは原始的で無駄ばかりですね...
16進からカナ変換で表記なのでしょうか?

あと、後述して頂いたソースで検証するとうまく印字できるのですが、
最初に紹介頂いたソースで、

.WriteText Text1.Text   '書き込み

の記述を、

.WriteText "てすとテスト亜意卯"  '書き込み

としてみたのですが、化けて印字されてしまいます...

イベント発生時刻の取得、同行に印字、印字カラーも指定  を考えているので
その都度、漢字モード突入→印字→印字モード解除(ASCIIモード突入)で
処理したいと思っています

見よう見まねで、ソースの意味がつかめていないのも問題かもしれませんが...

宜しければ又教えて頂けないでしょうか?

以上、宜しくお願い致します。

編集 削除
魔界の仮面弁士  2011-05-18 01:11:08  No: 102909  IP: [192.*.*.*]

> 16進からカナ変換で表記なのでしょうか?
仰っている意味が良く分かりませんが、
  A = Chr(36)
  B = Chr(&H24)
  C = "$"
とした場合、A と B と C が同じ文字列であることは簡単に確認できますよね。
また、逆変換したいなら、Asc("$") で 36 が得られますし、Hex(36) は "24" です。


一方、"てすと" を 24,46,24,39,24,48 (16進表記) に変換するとなると、
ADODB.Stream オブジェクトを用いた先述のサンプルのように、
若干、面倒な手続きが必要となります。逆もまた然り。



> .WriteText Text1.Text   '書き込み
> の記述を、
> .WriteText "てすとテスト亜意卯"  '書き込み

少なくとも、
  Text1.Text = "てすとテスト亜意卯"
  .WriteText Text1.Text

  .WriteText "てすとテスト亜意卯"
は完全に同一です。


> としてみたのですが、化けて印字されてしまいます...
化けた場合と化けない場合とで、印刷処理に渡した
変数の中身がどのように違うのか、データの内容を確認されましたか?


> ソースの意味がつかめていないのも問題かもしれませんが...
分からない点はどこでしょうか。
得られたバイナリの意味は分かりますか?

それとも、個々のバイナリ値がどの文字を渡すのかは分かるけれども、
先述のコードの各行が、何を行っているのかが分からないのでしょうか?

あるいは、個々のメソッドやプロパティの意味も分かるけれども、
それを印刷処理に渡す部分で躓いているのでしょうか?

編集 削除
テンパリ  2011-05-18 09:48:35  No: 102910  IP: [192.*.*.*]

度々申し訳御座いません
>A = Chr(36)
>B = Chr(&H24)
>C = "$"
ASC変換である事を理解致しました

最初に前述頂いたソースに
Text1.Text = "てすとテスト亜意卯"
が無かったので良く理解出来ませんでした...
同一表記である事で了解致しました。

前後3バイト読み捨てた場合の変数データは

 s = "←$B$F$9$H%F%9%H0!0U1,←(B"でした

分からない点としては
>先述のコードの各行が、何を行っているのかが分からないのでしょうか?
です

色々と調べてみたいと思います

以上、宜しくお願い致します。

編集 削除
テンパリ  2011-05-19 09:31:42  No: 102911  IP: [192.*.*.*]

御世話になります

ようやく一通り出来たのですが、新たな問題が...

Open sPrinter For Output As #1

で、「実行時エラー'52'  ファイル名または番号が不正です」

のエラーが出てしまいます...

sPrinter  は、  string  で  "LPT1:"  を指定しています

エラーの原因が掴めません...

どなたか分かられる方ご教示頂けないでしょうか?

宜しくお願い致します

編集 削除
魔界の仮面弁士  2011-05-19 16:31:44  No: 102912  IP: [192.*.*.*]

> Open sPrinter For Output As #1

まず、そのアクセス方法は推奨されていません。
Win9x 時代にはかろうじて使われてきた経緯もありますが、
本来は (Visual Basic ではなく) BASIC 時代のコーディング方法です。


> で、「実行時エラー'52'  ファイル名または番号が不正です」
主要因は分かりませんが、たとえば、
  (1) 該当するポートが存在しない。
  (2) そのポートが既に開かれている(前回閉じ忘れたなど)。
  (3) Open ステートメントでのアクセスが許可されていない。
などの理由から、
  「実行時エラー'52'  ファイル名または番号が不正です」
  「実行時エラー'53'  ファイルが見つかりません。」
  「実行時エラー'55'  ファイルは既に開かれています。」
  「実行時エラー'57'  デバイス I/O エラーです。」
などが発生する事があります。OS によっても差異がありますけれども。


> エラーの原因が掴めません...
VB6 から、プリンタに直接コマンドを発行したいのであれば API を使うべきです。
OpenPrinter、WritePrinter、ExtEscape 等々。
http://support.microsoft.com/kb/175083/ja

おまけで、5年半前に書いた VB.NET 版。
サイト閉鎖時にバックアップを取り忘れていたので、Internet キャッシュからの拾い出しです。
http://replay.web.archive.org/20070820234758/http://www.ocv.ne.jp/~oratorio/junk/Sample/39/WritePrinter.txt

編集 削除