タイトル : 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 変換で復元しようとしていたようですが、 既に破損してしまったデータは、もはや復元することは不可能です。 |