tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: COMP-3の変換につて
投稿日: 2017/09/26(Tue) 17:32
投稿者魔界の仮面弁士
> Private Type SEQ_DATA
>    W_010 As String * 6
>    W_040 As String * 4
(中略)
>    'W_CRLF As String * 2
> End Type
> Private GT As SEQ_DATA
(中略)
> Open "e:\mcl\dat\DGRS20" For Binary Access Read As #1 Len = 100
> Get #1, , GT

原因はこのあたりですね。ランダムアクセスの処理に問題があります。

バイナリデータを取り込みたいのであれば、ユーザー定義型には
As String や As String * n を一切含めないでください。

代わりに、Byte 型の一次元配列を使うようにします。


まず大前提として、COMP-3 は「バイナリデータ」です。
文字列ではありません。

それなのに、「As String * n」なデータ型で読み取ろうとしたため、
下記のような手順で処理されてしまい、データが破損することになります。


(1) 本来はバイナリデータでしたが、String 型へのファイル入出力が行われたため、
 VB6 はそれを Shift_JIS テキストなデータ(正確には CP932) とみなしてロードします。

→ Shift_JIS の文字集合でありえないバイト列が含まれた場合、それは代替文字 "・" に変わります。


(2) 破損しつつも読み取った文字列が、ANSI→Unicode 変換を伴って、VB の String 型に格納されます。
 Shift_JIS では区別できていた文字が、Unicode になると区別できなくなるケースがあるため、
 この時点でもデータ破損が発生することがあります。

→たとえば:
 Shift_JIS の 81,E3 を Unicode 変換した場合には 22,1A (√) になりますが、
 Shift_JIS の 87,95 を Unicode 変換した場合にも 22,1A (√) という同じ文字になります。


(3) 最初に御提示頂いたコードでは、
> MOTO = StrConv(GT.W_200, vbFromUnicode) ' システムコードに変換
などとして、Unicode → ANSI 変換で復元しようとしていたようですが、
既に破損してしまったデータは、もはや復元することは不可能です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。