• 締切済み

VB2008 2バイト文字の化け字は当然! Yes or No?

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

みんなの回答

回答No.1

私自身はそういう「素のままのバイナリファイルを扱う」経験はほとんど無いですが。 > 一体、この私の判断は正しいのでしょうか? 「このように」がどの範囲を行っているかわからないので回答は難しいですが、回避方法はあると思います。 >2バイト文字 ということは、内部的にはShift JISコードで格納されていると言うことでしょうか?(UTF-8やEUC_JPでは3バイトの文字もあった記憶が…) 参考: http://www.atmarkit.co.jp/fxml/askxmlexpert/024utf/24utf.html 大前提として、(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)の「使い方がおかしい」ということだと思います。

noname#140971
質問者

お礼

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

関連するQ&A