C#Api读取GetPrivateProfileString 方法乱码 缺少值,值补全解决。

1.问题,当我调用GetPrivateProfileString方法去读取指定键值时,我发现读取出来的值乱码,并且我不知道什么原因照成的。由于我写入编码格式与读取编码格式相同,用GetPrivateProfileString这个方法读取出的字节转为字符后出现乱码,但是写入的值并没有乱码。

如下图所示。

 回读采用的编码格式

readByteLength = GetPrivateProfileString
(section, result[i], null, buffer, 32767, path);
resultValue = Encoding.Unicode.GetString
(buffer, 0, ((int)readByteLength));

写入编码格式

/// <summary>
///  将指定的键和值写入到指定节点中,如果存在则替换掉,不存在则创建新的。
 /// </summary>
/// <param name="section">写入节点。</param>
 /// <param name="key">键。</param>
/// <param name="val">值。</param>
/// <param name="filePath">写入路径。</param>
/// <returns>返回写入结果。</returns>
 [DllImport("kernel32", CharSet = CharSet.Unicode)]// 返回0表示失败,相反成功。
private static extern uint WritePrivateProfileString(string section, string key, string val, string filePath);

解决这个问题的方法很简单,对GetPrivateProfileString方法返回的读取到的字节数*2.

 readByteLength = GetPrivateProfileString(section, result[i], null, buffer, 32767, path);
 resultValue = Encoding.Unicode.GetString(buffer, 0, ((int)readByteLength)*2);

干嘛要乘2呢,因为实际读取到缓冲区的值假如为6个字节,那么他返回读取到的字节数就会被除以2,当把字节通过指定编码格式转换为字符串时,由于只转换了一半所以就存在乱码,或者缺字现象。

 可以看到现在缓冲字节全部为空

如图所示,缓冲区字节数为4字节 ,返回值只有2,这就造成了中文读取乱码,缺值现象。在进行转换为字符串时乘2就解决这个问题了。当然我仍然不知道是不是我代码有问题还是系统原因导致的,至少目前是这样解决了。

 readByteLength = GetPrivateProfileString(section, result[i], null, buffer, 32767, path);
resultValue = Encoding.Unicode.GetString(buffer, 0, ((int)readByteLength)*2);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值