アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBコーディングで質問です。。

テキストをファイルで保存する際に、JISコードで保存するにはどうすればよいのでしょうか。

処理的には、
テキストを*.datファイルで保存するのですが。

'ファイルパスを取得
sFilePath = "A:\aaa.dat"

''使用可能なファイル番号を取得
iFileNo = FreeFile
Open sFilePath For Output As iFileNo

''ファイルに書き込む
Print #intFileNo, "oneline"
Close #intFileNo

上記のような処理をしています。
ファイルに書き込む前に、StrConv関数でvbFromUnicodeでコンバートすると文字化けしてしまう様子なので、
現在は特にコンバート処理はしていません。
しかし、この方法で保存すると保存した後のファイルはShift-JISになっているようなんです。。

Shift-JISではなく、JISコードで保存したいのですが何かいい方法はありませんでしょうか。
よろしくお願いします。

Win2000ProSP2
VB6.0SP5

A 回答 (4件)

intFileNoがintFlagと間違えて入力していました。


あと、半角カナの処理が抜けていました。
修正しましたが、動作検証はとっていません。

strFilePath = "A:\aaa.dat"
intFileNo = FreeFile
Open strFilePath For Binary As intFileNo

lngLen = Len(strText)
intFlag = 0

For i = 1 To lngLen
intCode = Asc(Mid$(strText, i, 1))
If intCode >= &H8140 Then
If intFlag <> 2 Then
intFlag = 2
Put #intFileNo, , &H1B
Put #intFileNo, , "$B"
End If
intHiCode = intCode \ &H100
intLoCode = intCode Mod &H100
intHiCode = intHiCode - IIf(intHiCode <= &H9F, &H71, &HB1)
intHiCode = intHiCode * 2 + 1
If intLoCode >= &H9F Then intHiCode = intHiCode + 1
If intLoCode > &H7F Then intLoCode = intLoCode - 1
intLoCode = intLoCode - IIf(intLoCode >= 9E, &H7D, &H1F)
intCode = intHiCode * &H100 + intLoCode
ElseIf intCode > &H80 And intCode <= &HDF Then
If intFlag <> 1 Then
intFlag = 1
Put #intFileNo, , &H1B
Put #intFileNo, , "(I"
End If
intCode = intCode - &H80
ElseIf intFlag <> 0 Then
intFlag = 0
Put #intFileNo, , &H1B
Put #intFileNo, , "(B"
End If
Put #intFileNo, , intCode
Next i

Close #intFileNo
    • good
    • 0
この回答へのお礼

ありがとうございます。。

何とか文字列の方、JISコードに変換という処理を行うことが出来たです。

扱うデータが半角英数字と半角カナだったので、
S-JISでも問題ないだろうということだったのですが、
私としても、文字列変換気になったので処理的に作成してみました(笑)

とってもお勉強になったです。
ありがとうございましたっっ。

お礼日時:2002/09/03 14:29

一概にJISと言っても、7bit JIS(ISO-2022-JP)と8bit JIS(EUC-JP)があります。


一般的にJISはISO-2022-JPの事を示すので、ISO-2022-JPに関して回答すると、

strFilePath = "A:\aaa.dat"
intFileNo = FreeFile
Open strFilePath For Binary As intFileNo

lngLen = Len(strText)
blnFlag = False

For i = 1 To lngLen
intCode = Asc(Mid$(strText, i, 1))
If intCode >= &H8140 Then
If Not blnFlag Then
blnFlag = True
Put #intFlag, , &H1B
Put #intFlag, , "$B"
End If
intHiCode = intCode \ &H100
intLoCode = intCode Mod &H100
intHiCode = intHiCode - IIf(intHiCode <= &H9F, &H71, &HB1)
intHiCode = intHiCode * 2 + 1
If intLoCode >= &H9F Then intHiCode = intHiCode + 1
If intLoCode > &H7F Then intLoCode = intLoCode - 1
intLoCode = intLoCode - IIf(intLoCode >= &H9E, &H7D, &H1F)
intCode = intHiCode * &H100 + intLoCode
ElseIf blnFlag Then
blnFlag = False
Put #intFlag, , &H1B
Put #intFlag, , "(B"
End If
Put #intFlag, , intCode
Next i

Close #intFlag

これはJIS X 0208以外は考慮していません。
JIS X 0213等に対応する場合はその為の変換式が必要です。

また、手元にVBの開発環境がないので未検証です。
正常に動作しなかったらゴメンなさい。
    • good
    • 0

>>自分でSJIS→JISに変換します。


APIとか関数でなければ自作するしかありません。
たしかAPIであったような気がするのですが私は使ったことがありません。

APIや関数を使わない方法での変換についてですが
2バイト(16ビット)文字は
上位8ビットと下位8ビットにわけます。
でそれぞれの値に足すか引くかするだけで
SJIS→JISに変換できます。(文字コード表があれば、導けると思います)
たしかVBでは文字列をバイト配列に一気にいれることが可能だったはず。(今手元にVB及びVB系の資料が何もないので・・・)

あとVBで役にたつ関数として
ASC(str)・・・最初の1文字のsjis文字コード(int型)を返す。
ASCB(str)・・・最初の1文字のsjis上位8ビット(int型)を返す。
ASCW(str)・・・最初の1文字のUNICODE(int型)を返す。
があります。

JISコードのテキストデータは2バイト文字、1バイト文字(a-Z 0-9)の
切り替えを行う、ビットがあります。
JISでもJIS7では半角カナの扱いが変わります。
さすがに具体的な値やどういう式だったかは覚えてないのでそれは
インターネットなりでお調べになってください。

※ちょっと前に、EUC、UNICODE、SJIS、JIS、UTF7の相互変換プログラムを
作ったのですが、もう全然忘れてます。。。
    • good
    • 0

JISコードで保存する場合


自分でSJIS→JISに変換します。
(ひょっとするとAPIか関数があるかもしれないですが、簡単な式なので。。)

そのときにJISの方はバイト型にいれていきます。
Openステートメントの場合、テキストモードでは保存できません。
バイナリモードで開く必要があります。
Open "TESTFILE" For Binary Access Write As #1

>文字化けしてしまう様子なので
ところでvbFromUnicodeでもWin2kだとUnicodeになるだけでは?

この回答への補足

>自分でSJIS→JISに変換します。

・・・という部分が上手く動作しません。
もしよければ、どんな関数(式?)なのか教えていただきたいのですが・・・。
StrConv関数ではありませんよね?
APIなのかな。。ごめんなさい。。

補足日時:2002/08/30 16:24
    • good
    • 0

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