博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建Unicode格式的INI文件
阅读量:5160 次
发布时间:2019-06-13

本文共 1681 字,大约阅读时间需要 5 分钟。

前段时间由于开发一个软件,需要调用别人的接口,虽然我的软件是Unicode编码,对方的模块也是Unicode编码,但是对方提供的接口却是Ansi接口,在非中文系统下,由于涉及到中文路径,导致Ansi和Unicode编码转换出现错误,转换结果不可逆转。

当OS的区域语言设置为中文时,转换接口可以逆转,可以正常使用。

     Microsoft提供了GetPrivateProfileStringA、WritePrivateProfileStringA、GetPrivateProfileStringW和WritePrivateProfileStringW用于读写INI文件;一下分成四种情况讨论字符串内部的转换逻辑

1)、文件格式为ANSI

         a、调用GetPrivateProfileStringA和WritePrivateProfileStringA接口:首先转换成GetPrivateProfileStringW和WritePrivateProfileStringW接口的调用,中间经过了ANSI字符串到Unicode字符串的转换(系统完成),然后在写文件时,又将Unicode字符串转换成Ansi字符串进行存储(系统完成),中间经过了两个不必要的转换步骤;

         b、调用GetPrivateProfileStringW和WritePrivateProfileStringW接口:在写文件时,将Unicode字符串转换成Ansi字符串进行存储(系统完成),中间经过了一个不必要的转换步骤。

2)、文件格式为Unicode

         a、调用GetPrivateProfileStringA和WritePrivateProfileStringA接口:首先转换成GetPrivateProfileStringW和WritePrivateProfileStringW接口的调用,中间经过了ANSI字符串到Unicode字符串的转换(系统完成),在写文件时,不再需要转换,中间经过了一个个不必要的转换步骤;

         b、调用GetPrivateProfileStringW和WritePrivateProfileStringW接口:由于文件格式和调用的接口都是Unicode格式,所以不存在中间转换过程,提高了效率。

 

Unicode格式的INI文件创建

 由于系统默认首次创建的文件为ANSI格式,所以需要在使用该文件之前,先用Unicode格式创建好INI文件,这样在读写写时就是正常的INI文件了。目前我知道创建文件有两种格式:

        1)、向文件中写入Unicode的文件头信息,具体文件写入有

FILE *fp;

    fp = _tfopen(_T("e://sss.ini"),_T("r"));
    if (fp == NULL)
    {
       fp=_tfopen(_T("e://sss.ini"), _T("w+b"));
        
        wchar_t m_strUnicode[1];
        m_strUnicode[0] = wchar_t(0XFEFF);
        fputwc(*m_strUnicode,fp);
    }
    fclose(fp);

 

         2)、以Unicode格式创建新文件

     FILE *pFile(NULL);

     if((nRet= _wfopen_s(&pFile, m_wszConfigFile, L"wt, ccs=UNICODE")) == 0)

         fclose(pFile);

  或者

    if((nRet= _wfopen_s(&pFile, m_wszConfigFile, L"wt, ccs=UTF-16LE")) == 0)  

         fclose(pFile);

  经测试,windows下默认编码950,ccs=UTF-16LE创建的unicode格式文件可以正确写入宽字符。

注意:调用读写INI文件的接口其实最后都是Unicode接口,具体写入到文件中的内容是由文件的格式决定,并非调用的接口决定。

转载于:https://www.cnblogs.com/lisuyun/p/5885524.html

你可能感兴趣的文章
Liunx常用命令(Mile)
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
spring boot开发REST接口
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
多表查询
查看>>
单表查询
查看>>
网络并发 数据库可能的面试题
查看>>
mysql 之多表查询
查看>>
高大上版解决粘包问题
查看>>
前端之BOM和DOM
查看>>
前端之JS
查看>>
前端之BootStrap
查看>>
前端之jQuery
查看>>