文字化けに対応したい

解決


変換  2010-11-29 19:21:24  No: 102731

VB6.0  SP6
WindowsXPにてソフトを作成しています。

もともとN88Basicで動作していたソフトを、Windowsで動作させるために
VB6.0にて作成しています。

Basicでは、&H20-&HA0までのAscii文字をそのまま、LPrintにて出力できたようですが、これを、そのままVB6.0のコードに落として、上記のAscii文字をシリアル通信で送信すると
 H,"%メB)・|J...
といった形で出力されました。

Strconvにて変換しても結果は同様でした。
どういった変換をすればいいのか、ご存知の方教えてください。


変換  2010-11-29 19:50:45  No: 102732

説明が足りなかったので、補足します。
PCと装置をシリアルで接続した環境にて、上記のソフトを動作させます。

PCから、" !#$%&'()..."と出力すると、
装置からは、" H,"%メB)・|J..."といった形で出力されます。


魔界の仮面弁士  2010-11-30 02:04:34  No: 102733

String 型に載せて送るのではなく、
Byte 配列に載せて送ってみてください。


変換  2010-11-30 03:34:17  No: 102734

Byte配列に
MSComm1.Output =&H20
MSComm1.Output =&H21
・・・
と送信しましたが、結果は同じでした。

MSComm1のInputModeは0です。


変換  2010-11-30 03:34:18  No: 102735

Byte配列に
MSComm1.Output =&H20
MSComm1.Output =&H21
・・・
と送信しましたが、結果は同じでした。

MSComm1のInputModeは0です。


加齢臭  2010-11-30 08:23:46  No: 102736

Dim OutByteData(1 To 4) As Byte
Dim OutStrData As String * 2

OutByteData(1) = &h41
OutByteData(2) = &h42
OutByteData(3) = &h43
OutByteData(4) = &h44
OutStrData = OutByteData()

MSComm1.Output = OutStrData

PDQCommだと出来ると思いますが。MSCommで
出来るかどうかは不明です。


魔界の仮面弁士  2010-11-30 18:34:10  No: 102737

MSComm.Output に「String 型」を渡す事も避けてください。
基本的には、「Byte の一次元配列」を渡すようにします。
http://support.microsoft.com/kb/411403/ja

バイト配列の作り方としては、
  Dim bin() As Byte
  ReDim bin(3)
  bin(0) = &H2A
  bin(1) = &H2B
  bin(2) = &H2F
  bin(3) = &H3A
のようにして作る方法や、XDR にて16進数文字列から
バイナリ変換する方法などがあります。

Private Sub Command1_Click()
    Dim bin() As Byte
    bin = GetBinary("2a2b2f3a")
    
    '
End Sub

Public Function GetBinary(ByVal hexString As String) As Byte()
    With CreateObject("Microsoft.XMLDOM").createElement("h")
        .DataType = "bin.hex"
        .Text = hexString
        GetBinary = .NodeTypedValue
    End With
End Function


変換  2010-11-30 19:19:09  No: 102738

みなさんアドバイスありがとうございました。
MSComm1.Output =chr(&H20)
と、Chr関数を使うことで正常に動作させることができました。
ありがとうございました。


魔界の仮面弁士  2010-11-30 20:01:16  No: 102739

>> &H20-&HA0までのAscii文字をそのまま、LPrintにて出力できたようですが
> と、Chr関数を使うことで正常に動作させることができました。

今回使いたい範囲は、&H20-&HA0 なのですよね。
であれば、Chr を使う方法は避けてください。

この範囲のデータを送出したい場合には、文字列ではなく
バイナリで扱うべきです。そうしないと、一部の文字が
破損してしまう可能性があります。(特に &H81-&H9F あたり)
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_43795_0.html

VB6 付属のヘルプ(MSDN ライブラリ)で、キーワード検索
『ASCII 文字セット』を確認してみてください。

そこに、
  ASCII 文字セット (0 - 127)
  ASCII 文字セット (128 - 255)
という一覧表があるのですが、その中で
  「これらの文字は、Microsoft Windows ではサポートされていません。」
と表記されている値を String にしようとすると、
正しく処理されない可能性があります。

Chr によるデータ破損の可能性は、下記のコードで確認できます。

'以下の処理は、9x 系 OS と NT 系 OS とで結果が異なります。
Dim i As Integer
Dim s As String
For i = &H20 To &HA0
    s = Chr(i)
    If Asc(s) = i Then
        Debug.Print Hex(i); " は化けずに処理されました。"
    Else
        Debug.Print Hex(i); " は破損しました。"
    End If
Next


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

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






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