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);