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
No.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
ありがとうございます。。
何とか文字列の方、JISコードに変換という処理を行うことが出来たです。
扱うデータが半角英数字と半角カナだったので、
S-JISでも問題ないだろうということだったのですが、
私としても、文字列変換気になったので処理的に作成してみました(笑)
とってもお勉強になったです。
ありがとうございましたっっ。
No.3
- 回答日時:
一概に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の開発環境がないので未検証です。
正常に動作しなかったらゴメンなさい。
No.2
- 回答日時:
>>自分で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の相互変換プログラムを
作ったのですが、もう全然忘れてます。。。
No.1
- 回答日時:
JISコードで保存する場合
自分でSJIS→JISに変換します。
(ひょっとするとAPIか関数があるかもしれないですが、簡単な式なので。。)
そのときにJISの方はバイト型にいれていきます。
Openステートメントの場合、テキストモードでは保存できません。
バイナリモードで開く必要があります。
Open "TESTFILE" For Binary Access Write As #1
>文字化けしてしまう様子なので
ところでvbFromUnicodeでもWin2kだとUnicodeになるだけでは?
この回答への補足
>自分でSJIS→JISに変換します。
・・・という部分が上手く動作しません。
もしよければ、どんな関数(式?)なのか教えていただきたいのですが・・・。
StrConv関数ではありませんよね?
APIなのかな。。ごめんなさい。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Excel(エクセル) エクセル2019でPDFファイル名に枝番号をつけたい。 アクティブワークシートを印刷した後の処理とし 4 2023/06/06 21:00
- Excel(エクセル) 【VBA】PDF出力に任意のファイル名前を付ける方法 3 2023/07/21 10:55
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
StreamReaderで読み込んだファ...
-
エクセルのマクロについて教え...
-
ATTファイルってどうやって開け...
-
VB(VBA)で、バイナリデータを使...
-
エクセルVBAでメールの自動作成...
-
既存のテキストファイルを開く方法
-
ファイルのチェックサムを改行...
-
テキストファイルの特定行の削...
-
テキストファイル内容の、16進...
-
VBA。開いているテキストファイ...
-
ファイル変換
-
テキストファイルの一部分を抽...
-
UTF-8とASCIIコードにおける互...
-
C言語でテキストファイルをバイ...
-
WIN8.1の2013で受けたメールXP...
-
テキストファイルのログをExcel...
-
テキストファイル固定長データ...
-
RGBデータからBMP画像へ
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ATTファイルってどうやって開け...
-
VBSでテキストファイルの2行目...
-
テキストファイルの一部分を抽...
-
既存のテキストファイルを開く方法
-
Excel VBAが徐々に遅くなる
-
テキストファイルの特定行の削...
-
Windowsのメモ帳でUTF-8を選択...
-
VB(VBA)で、バイナリデータを使...
-
テキストファイル内容の、16進...
-
エクセルVBAでメールの自動作成...
-
VBA。開いているテキストファイ...
-
[VB.NET] 処理の高速化を行いた...
-
ASP.NET Web上のテキストファ...
-
フォーム無しでアプリを作成す...
-
テキストファイル固定長データ...
-
ファイルのチェックサムを改行...
-
文字コードの変換(JISコードへ)
-
UTF-8とASCIIコードにおける互...
-
C言語でテキストファイルをバイ...
-
Excel+VBAでフランス語を扱いた...
おすすめ情報