FreeBASIC マニュアルのトップに戻る

UTF_ASCII_ENCODING ›› テキスト・ファイルの文字コード変換

Ascii → Unicode → Ascii 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

 テキスト・ファイルを、ShiftJIS→Unicode→ShiftJISと変換します。

 ファイルを開くダイアログを使って指定して、文字コード Ascii(ShiftJIS) のテキスト・ファイルを読み込みます。
このテキストの内容を、文字コード Unicode(UTF-16) に変換してテキスト・ファイルとして出力します。
検証のため、Unicode(UTF-16) で出力したテキスト・ファイルを再度読み込んで、ASCII(ShiftJIS)のテキスト・ファイルとして出力します。

追記:Unicode(UTF-16) のテキスト・ファイルを読み込んで、ASCII(ShiftJIS)のテキスト・ファイルとして出力するだけのバージョンもあります。

 このプログラムは、VANYA さんに教えていただいたコードを、微修正したものです。

 別に、FreeBASIC 標準機能だけを使ったバージョン もあります。


' EncodingShiftJISFile2Unicode2ShiftJIS_Window9Window9.bas
'' ★このプログラムは、★UNICODE(utf-16)★で保存しても、
'' ★ShiftJIS★で保存しても、同じ働きをします。★
''
'' このプログラムは、以下の動作を想定します。
''
'' 1) 指定した、ShiftJIS のテキスト・ファイルを読み込みます。
''    これを、UNICODE(utf-16) に変換して、ファイル出力します。
'' ★ここでWindow9 の関数AsciiToUtf を使います。★
''
'' 2) 検証のため、UNICODE(utf-16) で出力したファイルを読み返します。
''    これを、ShiftJIS に再変換して、ファイル出力します。
'' ★ここでWindow9 の関数UtfToAsciiを使います。★
''
'' 対象のテキスト・ファイルは、ファイルを開くダイアログで指定します。
'' ファイルを開くダイアログと文字コード変換は、Window9 ライブラリを使っています。
'' https://users.freebasic-portal.de/freebasicru/window9lib/window9.html
'' 変換後のファイルは、同じフォルダに別名で保存されます。


#Include "window9.bi"

Dim fName As String     '★拡張子無しのファイル名
Dim extension As String '★拡張子部分(例:.txt)
Dim FullPass As String  '対象ファイルのフルパス
Dim As UShort UNICODE_FILE_BYTE = &hFEFF 'Unicode ファイルのバイト数
Dim As HANDLE OUTPUTFILE, INPUTFILE      'ファイルのハンドル
Dim UnicodeMojiretsuPtr As WString Ptr   'Unicode 文字列のポインタ
Dim As Byte Ptr AsciiMojiretsu 'Ascii のバイト配列
Dim sASCII As String           'UTFTOASCII で返される文字列
Dim As Integer iSizeShiftJIS   'ShiftJIS のファイル・サイズ

'********************* Window9 のファイルを開くダイアログを使う *********************

FullPass = OpenFileRequester("ShiftJIS ファイルを指定","C:\test\","Text File(*.txt;*.csv;*.htm*)"_
+Chr(0)+"*.txt;*.csv;*.htm*"+Chr(0)+"All File(*.*)"+Chr(0)+"*.*"+Chr(0))

If FullPass<>"" Then
   fName = Left(FullPass,InStrRev(FullPass,".") -1)  '対象のテキストファイルのフルパスの、拡張子無し部分
   extension = Right(FullPass,Len(FullPass) - InStrRev(FullPass,".") +1) '対象テキストファイルのドット付き拡張子部分

'************** ShiftJIS から UNICODE(utf-16) ************************
  '' utf-16 コードで出力するためのファイルを開きます。
   OUTPUTFILE = OPEN_File(fName & "_UNICODE" & extension)
  '' ShiftJIS コードで、入力のためのファイルを開きます。
   INPUTFILE = Read_File(fName & extension)

   If INPUTFILE <> -1 Then 'ファイルが開いたことを確認します
      iSizeShiftJIS = Size_File(INPUTFILE)  'ShiftJIS ファイル・サイズを取得 ( -Ascii_FILE_BYTE)
      AsciiMojiretsu = Read_DataS(INPUTFILE,Size_File(INPUTFILE)) ' Get bytes out ascii file
     '日本語マルチバイトからワイドに変換
      UnicodeMojiretsuPtr = AsciiToUtf(PeekS(AsciiMojiretsu))
      If OUTPUTFILE<>-1 Then 'ファイルが開いたことを確認します
         Write_Word(OUTPUTFILE,UNICODE_FILE_BYTE)  'write unicode signal bytes
         Write_Data(OUTPUTFILE,CInt(UnicodeMojiretsuPtr),(Len(*UnicodeMojiretsuPtr))*2) 'unicode バイトを書き出します
         Close_File(OUTPUTFILE) 
      EndIf
      DeAllocate(AsciiMojiretsu)
      DeAllocate(UnicodeMojiretsuPtr)
      Close_File(INPUTFILE)
   EndIf
   
Else
   MessBox("メッセージ","ファイルが選択されませんでした!")
   End
EndIf

'************** UNICODE(utf-16) から ShiftJIS ************************
  '' UNICODE(utf-16)で、入力のためのファイルを開きます。
INPUTFILE = Read_File(fName & "_UNICODE" & extension)
  '' ShiftJIS コードで出力するためのファイルを開きます。
OUTPUTFILE = OPEN_File(fName & "_REZ" & extension )

If INPUTFILE <> -1 Then 'ファイルが開いたことを確認します
   Set_File_Pointer(INPUTFILE,2) ' Pointer on 2 byte
   Dim As Integer iSizeUNICODE = Size_File(INPUTFILE)-2 ' get size file - 2 ( -UNICODE_FILE_BYTE)
   AsciiMojiretsu = Read_DataS(INPUTFILE,iSizeUNICODE)  ' Get bytes out Unicode file
      'ワイドから、日本語マルチバイトに変換します。
   sASCII = UTFTOASCII(Cast(WString Ptr,AsciiMojiretsu))

   If OUTPUTFILE<>-1 Then 'ファイルが開いたことを確認します
      Write_Data(OUTPUTFILE,CInt(SAdd(sASCII)),iSizeShiftJIS)    'ascii バイトを書き出します
      Close_File(OUTPUTFILE)
   EndIf
   DeAllocate(AsciiMojiretsu)
   Close_File(INPUTFILE)
EndIf

MessBox("メッセージ","ファイル変換を終了しました!")

 Unicode(UTF-16) のテキスト・ファイルを読み込んで、ASCII(ShiftJIS)のテキスト・ファイルとして出力する


'  EncodingUnicode2ShiftJIS_Window9.bas
'' ★このプログラムは、★UNICODE(utf-16)★で保存しても、
'' ★ShiftJIS★で保存しても、同じ働きをします。★
''
'' このプログラムは、以下の動作を想定します。
''
'' 1) 指定した、UNICODE(utf-16) のテキスト・ファイルを読み込みます。
''    これを、ShiftJIS に変換して、ファイル出力します。
'' ★ここでWindow9 の関数 UtfToAscii を使います。★
''
'' 対象のテキスト・ファイルは、ファイルを開くダイアログで指定します。
'' ファイルを開くダイアログと文字コード変換は、Window9 ライブラリを使っています。
'' https://users.freebasic-portal.de/freebasicru/window9lib/window9.html
'' 変換後のファイルは、同じフォルダに別名で保存されます。


#Include "window9.bi"

Dim fName As String     '★拡張子無しのファイル名
Dim extension As String '★拡張子部分(例:.txt)
Dim FullPass As String  '対象ファイルのフルパス
Dim As UShort UNICODE_FILE_BYTE = &hFEFF 'Unicode ファイルのバイト数
Dim As HANDLE OUTPUTFILE, INPUTFILE      'ファイルのハンドル
Dim UnicodeMojiretsuPtr As WString Ptr   'Unicode 文字列のポインタ
Dim As Byte Ptr AsciiMojiretsu 'Ascii のバイト配列
Dim sASCII As String           'UTFTOASCII で返される文字列

'********************* Window9 のファイルを開くダイアログを使う *********************

FullPass = OpenFileRequester("UNICODE(UTF16)ファイルを指定","C:\test\","Text File(*.txt;*.csv;*.htm*)"_
+Chr(0)+"*.txt;*.csv;*.htm*"+Chr(0)+"All File(*.*)"+Chr(0)+"*.*"+Chr(0))

If FullPass<>"" Then
   fName = Left(FullPass,InStrRev(FullPass,".") -1)  '対象のテキストファイルのフルパスの、拡張子無し部分
   extension = Right(FullPass,Len(FullPass) - InStrRev(FullPass,".") +1) '対象テキストファイルのドット付き拡張子部分


   '************** UNICODE(utf-16) から ShiftJIS ************************
     '' UNICODE(utf-16)で、入力のためのファイルを開きます。
   INPUTFILE = Read_File(fName & extension)
     '' ShiftJIS コードで出力するためのファイルを開きます。
   OUTPUTFILE = OPEN_File(fName & "_ShiftJIS" & extension )
   
   If INPUTFILE <> -1 Then 'ファイルが開いたことを確認します
      Set_File_Pointer(INPUTFILE,2) ' Pointer on 2 byte
      Dim As Integer iSizeUNICODE = Size_File(INPUTFILE)-2 ' get size file - 2 ( -UNICODE_FILE_BYTE)
      AsciiMojiretsu = Read_DataS(INPUTFILE,iSizeUNICODE)  ' Get bytes out Unicode file
         'ワイドから、日本語マルチバイトに変換します。
      sASCII = UTFTOASCII(Cast(WString Ptr,AsciiMojiretsu))
      '以下は、Solbianca さんに教えていただいた解説
      'メモリ上にある Byte データ(バイナリデータ)の AsciiMojiretsu を、
      'Wstring 型のデータとして型変換して、そのメモリ上の位置を関数 UtfToAscii に渡します。
      '関数 UtfToAscii は、Wsting 型の文字列としてデータを扱い、それを ASCII に変換し、
      '文字列バッファとして String 型の sASCII に出力しています。

      If OUTPUTFILE<>-1 Then 'ファイルが開いたことを確認します
         Write_Data(OUTPUTFILE,CInt(SAdd(sASCII)),Len(sASCII))    'ascii バイトを書き出します
         Close_File(OUTPUTFILE)
      EndIf
      DeAllocate(AsciiMojiretsu)
      Close_File(INPUTFILE)
   EndIf
   
   MessBox("メッセージ","ファイル変換を終了しました!")
Else
   MessBox("メッセージ","ファイルが選択されませんでした!")
EndIf


http://mneniya.ucoz.ru/

←リンク元に戻る Window9 トップに戻る FreeBASIC マニュアル トップに戻る
補足 に戻る
ページ歴史:2013-01-04
WATANABE Makoto

ホームページのトップに戻る

表示-非営利-継承