- ベストアンサー
文字コードの変換(JISコードへ)
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
- みんなの回答 (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
その他の回答 (3)
- s2t
- ベストアンサー率79% (47/59)
一概に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の開発環境がないので未検証です。 正常に動作しなかったらゴメンなさい。
- sha-girl
- ベストアンサー率52% (430/816)
>>自分で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の相互変換プログラムを 作ったのですが、もう全然忘れてます。。。
- sha-girl
- ベストアンサー率52% (430/816)
JISコードで保存する場合 自分でSJIS→JISに変換します。 (ひょっとするとAPIか関数があるかもしれないですが、簡単な式なので。。) そのときにJISの方はバイト型にいれていきます。 Openステートメントの場合、テキストモードでは保存できません。 バイナリモードで開く必要があります。 Open "TESTFILE" For Binary Access Write As #1 >文字化けしてしまう様子なので ところでvbFromUnicodeでもWin2kだとUnicodeになるだけでは?
補足
>自分でSJIS→JISに変換します。 ・・・という部分が上手く動作しません。 もしよければ、どんな関数(式?)なのか教えていただきたいのですが・・・。 StrConv関数ではありませんよね? APIなのかな。。ごめんなさい。。
お礼
ありがとうございます。。 何とか文字列の方、JISコードに変換という処理を行うことが出来たです。 扱うデータが半角英数字と半角カナだったので、 S-JISでも問題ないだろうということだったのですが、 私としても、文字列変換気になったので処理的に作成してみました(笑) とってもお勉強になったです。 ありがとうございましたっっ。