電子書籍の厳選無料作品が豊富!

Function FileGetChar(ByVal f As String, ByVal p As Integer) As String
  Dim n As Integer = FreeFile()
  Dim c As Char = “”

  If File.Exists(f) Then
    FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1)
    Seek(n, p)
    If Not EOF(n) Then
      FileGet(n, c)
    End If
    FileClose(n)
  End If
  Return c
End Function

このようにSeek関数とFileGet関数を利用する限りでは2バイト文字の化け字は避けられない!

一体、この私の判断は正しいのでしょうか?

VB2008 Express Edition

A 回答 (1件)

私自身はそういう「素のままのバイナリファイルを扱う」経験はほとんど無いですが。



> 一体、この私の判断は正しいのでしょうか?
「このように」がどの範囲を行っているかわからないので回答は難しいですが、回避方法はあると思います。

>2バイト文字
ということは、内部的にはShift JISコードで格納されていると言うことでしょうか?(UTF-8やEUC_JPでは3バイトの文字もあった記憶が…)
参考:
http://www.atmarkit.co.jp/fxml/askxmlexpert/024u …

大前提として、(VB4以降では)String、Charなどの文字データの内部形式はUNICODEです。(つまりchar型は2バイト)
だから、上記の例で言うと、1バイト読み込んだ時点で内部的には2バイトのUNICODE文字列に変換されています。

なので、通常、バイナリ読み込みで文字列を読み込む場合はいったんバイト配列に格納してそれを一括で文字列に変換する方法をとることが多いはずです。

…といろいろ調べたらこんなページが見つかりました。参考になるのでは?
http://dobon.net/vb/bbs/log3-7/3702.html
まあ、ここではBinaryReaderを使っていますが、大事なのは
バイナリ配列を「sjisEnc.GetString」で日本語文字列に変換している部分。
(ReadBytes(3)は、FileGet(n, c)をで買い繰り返して3バイト分読み込むのと一緒なわけで)

ん?あれ?…というか、今気づいたのですが。
Binaryではなく、「レコード長1バイトのランダムファイル」でOPENして、2バイト文字を取得するというのはすごく不自然なのですが…。

よくわからなくなってきたので、質問文のコードのおかしい点。
*バイト配列ではなく、Charに直接突っ込んでいる
*バイト単位で読み込むのに「レコード長1バイトのランダムファイル」でOPENしている。

要するにSeek関数とFileGet関数(あとFileOpen)の「使い方がおかしい」ということだと思います。
    • good
    • 0
この回答へのお礼

英語圏で開発されたプログラミング言語。
ですから、何文字目をダイレクトに取得することも可能。
しかし、半角全角混在テキストでは不能。
仮に、半角全角混在テキストで1文字を固定長として宣言する方法があれば・・・。
また、そういう変換機能があれば・・・。
だと、話が違ってきます。
その辺りの情報を知りたかったということです。

お礼日時:2009/02/10 12:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!