DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WinMe 環境で取得したディレクトリが文字化けする

環境/言語:[開発 Win2000, VB.Net, FrameWork1.1 実行 WinMe]
分類:[.NET]

お世話になります。

Win2000, Microsoft.Net Framework 1.1, VB.Net にて、データベースアプリケーションを作成しています。
配布先の WinMe マシンでオープンファイルダイアログで、取得したディレクトリが、
指定したテキストボックスに正しく表示されないという不具合が発生しており、
解決の方法が見出せないのでこちらにメールいたしました。
(手元の Win2000, WinXP HomeEdition では問題なく動作しております)

配布先と同じ環境が作れず、また、直接伺えない状況のため、
テストコードを送り、実行してもらって結果を受け取って対策を考えるということをしています。

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

結果1:

1 .filenane 縺ョ諠・ア Shift-JIS 縺ァ縺吶・
C:\WINDOWS\・・セ橸スス・ク・・スッ・鯉セ歃test2\sample1.txt
2 .filenane 縺ョ諠・ア Uni-Code 縺ァ縺吶・
C:\WINDOWS\・・セ橸スス・ク・・スッ・鯉セ歃test2\sample1.txt

--- --- --- --- --- --- --- --- --- --- ---

結果2:

1 .filenane 縺ョ諠・ア Shift-JIS 縺ァ縺吶・
C:\test3\sample1.txt
2 .filenane 縺ョ諠・ア Uni-Code 縺ァ縺吶・
C:\test3\sample1.txt

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

上はユーザーのデスクトップにあるファイルを選択してもらった結果、
下はCドライブ直下にあるファイルを選択してもらった結果です。

どういった問題が考えられるのでしょうか?
とりあえず、テキストボックスへの出力時に文字化けしていることが
解決のヒントになると思うのですが...。
ご指導よろしくお願いいたします。

配布先には .NetFramework 1.- は入っている、とのことです。

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

尚、配布先で実行してもらったのは、以下のコードです。
変数は、MyOpenFileDialog は OpenFileDialog
MyDirectory は テキストファイルファイル出力先ディレクトリ、
TextBoxDirectory が当該テキストボックスです。

' ダイアログボックス表示
Private Sub DialogButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogButton.Click
With MyOpenFileDialog
.CheckFileExists = True
.RestoreDirectory = True
.FilterIndex = 2
If .ShowDialog() = DialogResult.OK Then
Dim MyStreamReader As New System.IO.StreamReader(.FileName)
TextBoxDirectory.Text = .FileName
MyStreamReader.Close()
S_TextBoxDirectoryLine("1 .filenane", MyDirectory & "FileNameJis.txt", .FileName, True)
S_TextBoxDirectoryLine("2 .filenane", MyDirectory & "FileNameUni.txt", .FileName, False)
End If
End With
End Sub
' ダイアログボックスの結果を出力するサブルーチン。
Private Sub S_TextBoxDirectoryLine(ByVal TitleString As String, ByVal DirectoryString As String, ByVal ThisFileNameString As String, ByVal EncodeJisBoolean As Boolean)
If System.IO.File.Exists(DirectoryString) Then
System.IO.File.Delete(DirectoryString)
End If
Dim objTxt As System.IO.FileStream = System.IO.File.OpenWrite(DirectoryString)
Dim objStw As System.IO.StreamWriter = New System.IO.StreamWriter(objTxt)
objStw.BaseStream.Seek(0, IO.SeekOrigin.Begin)
If EncodeJisBoolean = True Then
objStw.WriteLine(TitleString & " の情報 Shift-JIS です。" & Chr(10) & Chr(10) & ThisFileNameString, System.Text.Encoding.GetEncoding("Shift-JIS"))
Else
objStw.WriteLine(TitleString & " の情報 Uni-Code です。" & Chr(10) & Chr(10) & ThisFileNameString)
End If
objStw.Flush()
objStw.Close()
System.Diagnostics.Process.Start(DirectoryString)
End Sub
提示のソースコードで何をしたいのか意図がよくわかりません。

> 配布先の WinMe マシンでオープンファイルダイアログで、取得したディレクトリが、
> 指定したテキストボックスに正しく表示されないという不具合が発生しており、

という問題を特定・解決するためのコードに思えません。

よくわからないなりの予想としては、
とりあえず、StreamReader/StreamWriterクラスのヘルプは
きちんと読まれた方がよいかと思います。そこが今回の鍵になるような気がします。

> 配布先には .NetFramework 1.- は入っている、とのことです。

1.-というのは何ですか?1.1で作ったのなら、1.1が必要です。
基本的に1.0ではダメですので、注意が必要です。

> ' ダイアログボックス表示
> Private Sub DialogButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DialogButton.Click
> With MyOpenFileDialog
> .CheckFileExists = True
> .RestoreDirectory = True
> .FilterIndex = 2
> If .ShowDialog() = DialogResult.OK Then
> Dim MyStreamReader As New System.IO.StreamReader(.FileName)
> TextBoxDirectory.Text = .FileName
> MyStreamReader.Close()

MyStreamReaderは何がしたいのでしょう?何にも使われていませんが?
後、StreamReaderのコンストラクタのヘルプをご覧下さい。

> S_TextBoxDirectoryLine("1 .filenane", MyDirectory & "FileNameJis.txt", .FileName, True)
> S_TextBoxDirectoryLine("2 .filenane", MyDirectory & "FileNameUni.txt", .FileName, False)
> End If
> End With
> End Sub
> ' ダイアログボックスの結果を出力するサブルーチン。

この説明と関数の内容が一致していないので、何をしたいのかわかりません。

> Private Sub S_TextBoxDirectoryLine(ByVal TitleString As String, ByVal DirectoryString As String, ByVal ThisFileNameString As String, ByVal EncodeJisBoolean As Boolean)
> If System.IO.File.Exists(DirectoryString) Then
> System.IO.File.Delete(DirectoryString)
> End If
> Dim objTxt As System.IO.FileStream = System.IO.File.OpenWrite(DirectoryString)
> Dim objStw As System.IO.StreamWriter = New System.IO.StreamWriter(objTxt)

StreamWriterのコンストラクタのヘルプをご覧下さい。

> objStw.BaseStream.Seek(0, IO.SeekOrigin.Begin)

何のためのSeekでしょう?

> If EncodeJisBoolean = True Then
> objStw.WriteLine(TitleString & " の情報 Shift-JIS です。" & Chr(10) & Chr(10) & ThisFileNameString, System.Text.Encoding.GetEncoding("Shift-JIS"))

StreamWriterのWriteLineでこのような使い方はありませんが、
何を意図していますか?
後、Chr(10) & Chr(10)って何でしょうか?(これは改行ではありません)
Ken-ko です。お世話になります。

お返事遅れてしまい申し訳ありませんでした。
よねKENさんの仰ること、いちいちごもっともで、
しばらくの間、投稿する気が失せておりました...。

もともと先方に配布したアプリケーションは、
オープンファイルダイアログで取得したパスがテキストボックスに表示され、
そのテキストボックスに表示されたパスに正しく .mdb ファイルがあれば、実行ボタンを押したときに
そのファイルを開くことができる、というものでした。

起動時にログのテキストファイルから前回起動時に最後にアクセスを試みたパスを
表示するようにしておりました。

今回お見せしたコードは、それを適当に作り直して先方に配布したものを、
さらに中途半端に改変して投稿したものでした。

また、お見せしたものより前の段階で先方に配布していたプログラムの実行結果から、
テキストボックスへの表示の段階ではなく、パスを取得したところで
すでに何かの問題が発生しているのではないかと考えておりました。
そこで、OpenFileDialogの結果をすぐ出力してみたわけでした。

そのため、タイトル、前文とコードもかみ合わず、
大変意図の不明解なご質問になってしまいました。
お詫びいたします。

また、恥かしながら、私、chr(10) を改行コードなのだと信じきっておりました...。
こちらも、いただいたお返事からこのたび知った次第です。

また、StreamWriterのWritelineとWriteの使い分けもよく分かっていませんでした。

以上、今後気をつけたいと思います。
大変申し訳ありませんでした。

さて、よろしければ、どうかもう少しおつき合いください...。

>>配布先には .NetFramework 1.- は入っている、とのことです。
> 1.-というのは何ですか?1.1で作ったのなら、1.1が必要です。
> 基本的に1.0ではダメですので、注意が必要です。

1.1であることを確認いたしました...。

コードは、
・OpenFileDialog の結果の .FileName を取得してすぐにその内容をテキストファイルに出力したい
・ファイルに出力する段階で何かの間違いが起こっているかもしれないので、Shift-JisとUniCodeの両方で出力してみたい
という意図で作ったものでした。

実際のところ、Directory文字列が文字化けする、ということはあるのでしょうか?
(ExcelVBA関連の記事かなにかで、Win2000系以外で生じる問題だと読んだ気がしているのですが...)
手元のWin2000ではそういう問題は起こっておりませんし、そこが鍵になるのではないか、という気がしています。

もし何かご存知か、参考になる情報のあるURLなどにお心当たりがありましたら、
教えていただけると幸いです。

お手数をおかけして申しわけありませんが...。
よろしくお願いいたします。
■No3930に返信(Ken-Koさんの記事)
> Ken-ko です。お世話になります。
>
> お返事遅れてしまい申し訳ありませんでした。
> よねKENさんの仰ること、いちいちごもっともで、
> しばらくの間、投稿する気が失せておりました...。

私もなんだかキツイ書き方になってしまってごめんなさい。
あんまり?マークを連発したり、まくしたてるように書いてはよくないなと
知りつつ、そういう書き方になってました。

> そのため、タイトル、前文とコードもかみ合わず、
> 大変意図の不明解なご質問になってしまいました。
> お詫びいたします。

今回の説明でアプリで行っていることはわかりました。
が、前回、提示いただいたソースコードは文法的におかしく動作しないコードですので、
実際に使用しているソースコードから動く形で抜粋して下さい。
#こちらで動作確認はしませんが、机上でも内容の確認はできますから

> また、恥かしながら、私、chr(10) を改行コードなのだと信じきっておりました...。
> こちらも、いただいたお返事からこのたび知った次第です。

CR(キャリッジリターン) = 文字コード:13
LF(ラインフィード) = 文字コード:10

WindowsではCR+LFが、UNIXではLFが、MacではCRが改行コードとして扱われます。
(Macについて聞いただけで実際に確認したことはありませんが)

> また、StreamWriterのWritelineとWriteの使い分けもよく分かっていませんでした。

前回の私の投稿(No3900)で、StreamWriterのWriteLineの使い方がおかしいと
言ったのは、WriteLineメソッドで引数にEncodingクラスを取るものはないからです。
StreamReader/StreamWriterではコンストラクタでEncodingを指定します。

> コードは、
> ・OpenFileDialog の結果の .FileName を取得してすぐにその内容をテキストファイルに出力したい
> ・ファイルに出力する段階で何かの間違いが起こっているかもしれないので、Shift-JisとUniCodeの両方で出力してみたい
> という意図で作ったものでした。

・Shift_JISのデータとUnicodeのデータの書き出しロジックは正しいですか?
 →StreamWriterのオブジェクトを生成しているところから書き出しているところのロジックを提示してください
・Shift_JISのデータとUnicodeのデータはそれぞれ別のファイルに書き出していますか?
・さらに書き出したShift_JISのデータ、Unicodeのデータの内容は、
誰が、どのOSで、何のツールを使って確認されていますか?

> 実際のところ、Directory文字列が文字化けする、ということはあるのでしょうか?

外部ファイルなりDBなりとのやり取りなしのアプリ内のみの処理で、
通常、文字列データが文字化けすることはありません。
また、ファイルIOでも、StreamWriterで書き出した方法と
対になる方法でStreamReaderでテキストを読み込んでいれば化けることはありません。
文字列が化けるのは、そういうコードを書いてしまっている部分があるからだと思います。
危惧されるのは、
・もともとのアプリのコード ・・・問題発生中
・その問題を確認するためのテストコード
・テスト結果の確認方法
の2箇所以上で問題が起きると何が問題か?がわからなくなってしまう点です。
よねKENさま

Ken-ko です。お世話になります。
今回お見せした見苦しいコードのどこがどうおかしかったのかは不明ですが...。

ご指摘にあったことを見直し、シンプルなテストコードを書いて先方に送ったところ、
.Filenameで受け取ったディレクトリも正しく表示され、その代わり、

---

System.InvalidOperationException: .Net Data OLE DB
Provider(System.Data.OleDb) には Microsoft Data Access Components(MDAC)
version 2.6 以降が必要です。

---

というエラーメッセージを受け取りました。
ここから問題をつきとめ、このたび無事解決することができました。

テストコードを実行する相手の人からのレスポンスをなかなか受け取ることが
できなかったためお返事に時間がかかってしまいましたが、
ということで、とにかく、やりたいことについては解決いたしました。

このたびはありがとうございました。また、ご迷惑をおかけいたしました。
それでは、失礼いたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板