Csvが文字化けします。お助けください

Open "C:\test\Text\Day\9102.txt" For Output As #3
    print #3, """"& ファイル名 &"""," & 成分数 & Chr(10) &""""& Tname1 &""","""& Tname2 & 成分名st &""","""& Sname1 &""","""& Sname2 &""","""& Sname3 &""","""& Sname4 &""""& Chr(10) &""""& TimeData1(1) 
    Close #3

これは例ですが、このようなprintを利用したファイル作成をしています。この時
”データNo”という文字列が"テfチ[テ^No"に変わってしまいます。

文字コードが違うのでしょうがvbaではこのようなことは発生しませんでした。
修正する方法などありますでしょうか

開いたソフトはメモ帳で文字コードANSIで開いています。
スクリーンショット 2024-05-21 120143

お力添えいただけますと幸いです

Win10+LibO767で再現しませんでした
メモ帳ではANSIですが、別のテキストエディタではShiftJISでした
VBASupport 1の有無は?(私はありで試しました)
「データNo」のデータは半角カナですか?
また、セルの値ですか?文字列変数ですか?配列ですか?
コードをシンプルにして原因がわかればいいのですが

ご協力ありがとうございます。
情報を追加します。

データNoは全角です。
値はstringの文字を格納した変数です。
VBASupportは使っていません。(マクロにパスワードが書けれないため)

以上です。

csv106041.ods (13.2 KB)
WindowsだとShiftJIS
LinuxだとUTF-8になりました
文字化けしていません

https://opengrok.libreoffice.org/xref/core/basic/source/runtime/iosys.cxx?r=7d6e751f#751

デフォルトというか基本的なPrint命令では、Windowsの場合に
Shift-JISが使われます。

Windowsでのテキストファイル書き込みは、
文字コードをUTF-8で指定して、
以下のようにしています。

call writeEncodedText(sFilePath, list, “UTF-8”)

Sub writeEncodedText(myPath As String, myList As Object, myEncoding As String)
 Dim myTextFile As Object, mySf As Object, myFileStream As Object

 On Error Goto fileKO

                    mySf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
              myTextFile = createUnoService("com.sun.star.io.TextOutputStream" )
            myFileStream = mySf.openFileWrite(myPath)
 myTextFile.OutputStream = myFileStream
     myTextFile.Encoding = myEncoding

for i = lbound(myList) to ubound(myList)
	 myTextFile.writeString(myList(i) & chr(10))
next i

 myFileStream.closeOutput : myTextFile.closeOutput

 On Error Goto 0
 Exit Sub

 fileKO:
 Resume fileKO2

 fileKO2:
 On Error Resume Next
 msgBox("File write error !")
 myFileStream.closeOutput : myTextFile.closeOutput

 On Error Goto 0
End Sub

LinuxでもWindowsでも同じように動かすには、ひと工夫必要なのが難点ですが、Excelの動作に寄せたんでしょうね。。

2 Likes

hidemune様
ありがとうございます!
どうやっても文字化けしていた問題が解決しました!

以下解決コードです。

Sub readEncodedText(myPath As String, myEncoding As String)
 Dim myTextFile As Object, mySf As Object, myFileStream As Object, myLine As String, myData() As String
 Dim i As Integer

 On Error Goto fileKO

 mySf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
 myTextFile = createUnoService("com.sun.star.io.TextInputStream")
 myFileStream = mySf.openFileRead(myPath)
 myTextFile.InputStream = myFileStream
 myTextFile.Encoding = myEncoding

 i = 0
 Do While Not myTextFile.isEOF()
     myLine = myTextFile.readLine()
     myData = split(myLine, ",")
     濃度警報値(i) = myData(0)
     流路別名称(i) = myData(1)
     i = i + 1
 Loop

 myFileStream.closeInput : myTextFile.closeInput

 On Error Goto 0
 Exit Sub

 fileKO:
 Resume fileKO2

 fileKO2:
 On Error Resume Next
 msgBox("File read error !")
 myFileStream.closeInput : myTextFile.closeInput

 On Error Goto 0
End Sub

Call readEncodedText("c:\???.csv", "Shift_JIS")

他の問題でcsvの読込でも文字化けが発生していたのですが上記コードで無事読み込めました
本当にありがとうございます!

3 Likes