C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

vb.net でiniファイルを読みたいと思います

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■95766 / inTopicNo.1)  vb.net でiniファイルを読みたいと思います
  
□投稿者/ 年寄プログラマー (4回)-(2020/09/20(Sun) 21:35:51)

分類:[.NET 全般] 

年寄でVB初心者です

vb.netでiniファイルを読みたいと思います
参照(import含む)を含み、簡単な例を教えて下さい

引用返信 編集キー/
■95767 / inTopicNo.2)  Re[1]: vb.net でiniファイルを読みたいと思います
□投稿者/ 魔界の仮面弁士 (2838回)-(2020/09/21(Mon) 02:00:14)
No95766 (年寄プログラマー さん) に返信
> vb.netでiniファイルを読みたいと思います
> 参照(import含む)を含み、簡単な例を教えて下さい

ini ファイルは 16bit 時代の名残で使われるものであり、
.NET の場合は、.config やレジストリの方が望ましいですが、それはさておき。

ini ファイルの操作ということであれば、この掲示板の左上 [C# と VB.NET 入門] に
[ライブラリ] - [IniFile クラス] がありますが、それは試されましたか?

もし、API でのアクセスがお好みなら、このあたりにサンプルと解説があります。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html
引用返信 編集キー/
■95796 / inTopicNo.3)  Re[2]: vb.net でiniファイルを読みたいと思います
□投稿者/ 年寄プログラマー (1回)-(2020/09/24(Thu) 19:39:23)
ご指導ありがとうございます

教えていただいたHPを見ましたが
すみません。不勉強で理解できませんでした。

そこで
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (
ByVal lpApplicationName As String,
ByVal lpKeyName As String,
ByVal lpDefault As String,
ByVal lpReturnedString As String,
ByVal nSize As Integer,
ByVal lpFileName As String) As Integer

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Const DEF_STR As String = vbNullString
Dim buffer As String = New String(" ", 255) 'Spaceが1024文字
Dim iniFileName As String = "C:\Users\Owner\Documents\test.ini" 'INIファイル名
Dim ret As Integer = GetPrivateProfileString("SAMPLE", "key2", DEF_STR, buffer, 256, iniFileName)

Dim strVal As String = buffer.Substring(0, buffer.IndexOf(vbNullChar))
Label1.Text = strVal

End Sub

  で test.ini 

  [SAMPLE]
  key1=12534
  key2=C:\Users\Owner\Documents\test.ini漢字

  を読めば


  C:\Users\Owner\Documents\test.ini貍「蟄・

  になってしまいます
  何処がおかしいでしょうか?


引用返信 編集キー/
■95797 / inTopicNo.4)  Re[3]: vb.net でiniファイルを読みたいと思います
□投稿者/ Hongliang (1091回)-(2020/09/24(Thu) 19:49:51)
最近はメモ帳なども含めテキストファイルはUTF-8で扱うのが一般的になっていますが、GetPrivateProfileStringはANSI(日本語版WindowsであればいわゆるShift_JIS)のテキストファイルしか読み取れません。
GetPrivateProfileStringの制限なので、これを使用する限りはどうにもなりません。Shift_JISで保存するか、他の手段を使うかです。
もちろんShift_JISでやるのであれば、諸外国語の文字の大半や絵文字等は使えないことになります。まあこの辺はiniファイルにはあんまり関係ないかもしれませんが。
引用返信 編集キー/
■95798 / inTopicNo.5)  Re[3]: vb.net でiniファイルを読みたいと思います
□投稿者/ 大谷刑部 (104回)-(2020/09/25(Fri) 13:47:06)
No95796 (年寄プログラマー さん) に返信
>   で test.ini 
>
>   [SAMPLE]
>   key1=12534
>   key2=C:\Users\Owner\Documents\test.ini漢字
>
>   を読めば
>
>
>   C:\Users\Owner\Documents\test.ini貍「蟄・
>
>   になってしまいます
>   何処がおかしいでしょうか?
>

↓ファイル名、パスと中身が同じかどうかわかりませんが
http://tooljp.com/language/VBScript/faq/1B01D5B75DD944A2492585290014AE9E.html

の同種の現象じゃないですか?
一番安全なのは、ファイル名は英数のみ(いわゆる禁則文字系も元のAPIが古いだけに危険かも)で、
パスもあんまり長くならない方がいいかも。
DOSの時代の規則を前提にしてる可能性があるので。

引用返信 編集キー/
■95799 / inTopicNo.6)  Re[4]: vb.net でiniファイルを読みたいと思います
□投稿者/ 魔界の仮面弁士 (2841回)-(2020/09/25(Fri) 15:16:10)
No95797 (Hongliang さん) に返信
> GetPrivateProfileStringはANSI(日本語版WindowsであればいわゆるShift_JIS)のテキストファイルしか読み取れません。

GetPrivateProfileStringA の代わりに
GetPrivateProfileStringW を使うようにすれば、Shift_JIS だけでなく
Unicode (UTF-16 リトルエンディアン/BOM無し) 形式の ini にも対応できます。

※UTF-8 は非対応
引用返信 編集キー/
■95800 / inTopicNo.7)  Re[3]: vb.net でiniファイルを読みたいと思います
□投稿者/ 魔界の仮面弁士 (2842回)-(2020/09/25(Fri) 15:34:26)
No95796 (年寄プログラマー さん) に返信
> key2=C:\Users\Owner\Documents\test.ini漢字
>   を読めば
> C:\Users\Owner\Documents\test.ini貍「蟄・
> になってしまいます

UTF-8 でエンコードされたテキストを、Shift_JIS でデコードした場合の化け方ですね。

ini をメモ帳で開いて、[ファイル]-[名前を付けて保存] を選択してみてください。

文字コードのところが [UTF-8] になっていると思うので、
それを UTF-16 LE(または ANSI)に変更しなおせば、文字化けしなくなるかと。



> Dim buffer As String = New String(" ", 255) 'Spaceが1024文字
コメントとコードが一致していないようです。
1024 文字じゃなくて 255 文字ですよね?

また、上記の代入式の右辺は、
New String(" ", 255) ではなく
New String(" "c, 255) とするべきです。
引用返信 編集キー/
■95801 / inTopicNo.8)  Re[4]: vb.net でiniファイルを読みたいと思います
□投稿者/ 魔界の仮面弁士 (2843回)-(2020/09/25(Fri) 15:43:00)
No95800 (魔界の仮面弁士) に追記
>>key2=C:\Users\Owner\Documents\test.ini漢字
>>  を読めば
>>C:\Users\Owner\Documents\test.ini貍「蟄・
>>になってしまいます
> UTF-8 でエンコードされたテキストを、Shift_JIS でデコードした場合の化け方ですね。

保存時の符号化方式と、
読込時の符号化方式が異なれば、正しく読み取れません。


参考までに、『test.ini漢字』という文字列を、
Shift_JIS / UTF-16 / UTF-8 でエンコードして、
それを、正しい or 間違った符合化方式でデコードした場合に
どのような化け方になるかをテストしてみました。


Dim txt As String = "test.ini漢字"

Dim result As New System.Text.StringBuilder()
result.AppendLine("元の文字列: " & txt)
Dim enc() As String = {"Shift_JIS", "UTF-16", "UTF-8"}
For Each src In enc
  For Each dst In enc
    Dim srcBin As Byte() = System.Text.Encoding.GetEncoding(src).GetBytes(txt)
    Dim dstStr As String = System.Text.Encoding.GetEncoding(dst).GetString(srcBin)

    result.AppendLine(src & " => " & dst & ": " & dstStr.Replace(vbNullChar, ""))
  Next
Next

MsgBox(result.ToString(), MsgBoxStyle.Information)
引用返信 編集キー/
■95802 / inTopicNo.9)  Re[5]: vb.net でiniファイルを読みたいと思います
□投稿者/ 年寄プログラマー (5回)-(2020/09/26(Sat) 09:19:19)
No95801 (魔界の仮面弁士 さん) に返信
ありがとうございます
上手くいきました
お手数をお掛けしました

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ