2008/01/21(Mon) 01:54:15 編集(投稿者)
■No12916 (Blue さん) に返信
> >実際、Shift_JIS に無い文字、たとえば中文の「ニイハオ」(2文字)なども取得できましたし。
> これはUTF-8コードのものということでしょうか?
ですから、UTF-16 だと書いているでは無いですか。(^^; <No12912,No12915
> GetPrivateProfileStringWで2バイト文字でShift_JISにもUTF-8にもある文字を読んだときはどうなるのでしょうか?
「2バイト文字」というのは、具体的には何を意味していますか?
たとえば、「α」の文字は、Shift_JIS でも UTF-8 でも UTF-16 でも『2 バイト』ですが、
「A」の文字は、Shift_JIS や UTF-8 だと『1 バイト』、UTF-16 では『2 バイト』で、
「阿」の文字は、Shift_JIS や UTF-16 だと『2 バイト』、UTF-8 では『3 バイト』ですね。
> UTF-8の場合GetPrivateProfileStringAでByte型で取得して、自前でEncodingクラスでUTF-8で変換しないと
> 取得できるとは思わないのですが、なにかおおきな勘違いをしていますかね?
ここで「UTF-8」が出てきた理由がわかりませんが、Windows は UTF-8 形式の ini ファイルを
サポートしていなかったはずです。(元質問者の方も、UTF-8 という言葉は使っていませんよね?)
とりあえずサンプル。
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
class Sample
{
static void Main(string[] args)
{
string fileName = @"C:\sample.ini";
using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.Unicode))
{
sw.WriteLine("[SAMPLE]");
sw.WriteLine("中文=\u4f60好");
sw.WriteLine("日本語=こんにちは");
sw.Close();
}
string a = IniFile.GetIniStringW("SAMPLE", "中文", "HELLO", fileName);
string b = IniFile.GetIniString ("SAMPLE", "中文", "HELLO", fileName);
string c = IniFile.GetIniStringW("SAMPLE", "日本語", "HELLO", fileName);
string d = IniFile.GetIniString ("SAMPLE", "日本語", "HELLO", fileName);
}
}
class IniFile
{
[DllImport("Kernel32.dll")]
private static extern uint GetPrivateProfileString(
string section,
string key,
string defaultText,
StringBuilder buffer,
uint size,
string file
);
[DllImport("Kernel32.dll", CharSet=CharSet.Unicode)]
private static extern uint GetPrivateProfileStringW(
string section,
string key,
string defaultText,
StringBuilder buffer,
uint size,
string file
);
public static string GetIniString(string section, string key, string defaultText, string fileName)
{
StringBuilder sb = new StringBuilder(300);
uint ret = GetPrivateProfileString(section, key, defaultText, sb, 300U, fileName);
return sb.ToString();
}
public static string GetIniStringW(string section, string key, string defaultText, string fileName)
{
StringBuilder sb = new StringBuilder(300);
uint ret = GetPrivateProfileStringW(section, key, defaultText, sb, 300U, fileName);
return sb.ToString();
}
}
> ■No12916
> 2008/01/21(Mon) 01:41:19 編集(投稿者)
> 2008/01/21(Mon) 01:38:56 編集(投稿者)
> 2008/01/21(Mon) 01:35:49 編集(投稿者)
> <削除>
# ありゃ、入れ違っちゃったか。投稿前にリロードしておけばよかったかな…。