【C#】读写ini文件出现乱码,简单解决方法

2,768 阅读2分钟

前言

最近公司在做多语言版本,然而遇到一个头疼的问题就是,乱码问题,做的语言西班牙语,

之前使用C#使用WritePrivateProfileString和GetPrivateProfileString读取ini文件,中文英文都没问题,

但是现在做的是西班牙版本,有些很特殊的字符,为了方便使用,翻译先写在Excel表格,然后自己做一个小工具导出数据到ini文件

说的ini文件,因为之前多语言的实现方式就是用ini文件,所有现在也还是用ini文件了

一开始,要整理翻译导出数据到ini文件,最先想到的是用wps宏导出数据,用vb写,结果也遇到乱码的问题,改用C#写,还是遇到乱码的问题

多语言方案还是用官方的.resx格式的资源文件方式比较好,可视化调整布局

解决方法

然后,我就查了很多资料,在网上还是没有查到解决乱码方法。

因为之前软件还做了法语版本(之前的版本都不是我做的),在软件加载时会读取ini文件数据,我想也许有遇到乱码的问题,看看怎么加载,最后在之前的项目看到一行代码

[DllImport("kernel32", CharSet = CharSet.Unicode)]

CharSet: 指示如何向方法封送字符串参数,并控制名称重整。

然后问题就这么解决了,还是要向大佬学习

最后,附上读写ini文件,解决出现乱码的代码

[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        
/// <summary>
///读取ini文件数据
/// </summary>
/// <param name="Section"></param>
/// <param name="Key">键名</param>
/// <param name="def">默认值</param>
/// <param name="filePath">文件路径</param>
/// <returns>读出内容</returns>
public static string ReadValueFromIniFile(string Section, string Key, string def, string filePath)
{
    StringBuilder temp = new StringBuilder(4096);
    int i = GetPrivateProfileString(Section, Key, def, temp, 4096, filePath);
    return temp.ToString();
}

/// <summary>
/// 写入数据到ini文件
/// </summary>
/// <param name="Section"></param>
/// <param name="Key">键名</param>
/// <param name="Value">键值</param>
/// <param name="filePath">文件路径</param>
public static void WriteValueFromIniFile(string Section, string Key, string Value, string filePath)
{
    WritePrivateProfileString(Section, Key, Value, filePath);
}