zoukankan      html  css  js  c++  java
  • 创建Unicode格式的INI文件

    前段时间由于开发一个软件,需要调用别人的接口,虽然我的软件是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接口,具体写入到文件中的内容是由文件的格式决定,并非调用的接口决定。

  • 相关阅读:
    ( KMP 求循环节的个数)Power Strings -- poj -- 2406
    (矩阵快速幂) Fibonacci -- poj -- 3070
    (字符串处理)Fang Fang -- hdu -- 5455 (2015 ACM/ICPC Asia Regional Shenyang Online)
    (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)
    (最短路 spfa)Wormholes -- poj -- 3259
    (水题) Div 3 -- SGU -- 105
    (水题)987654321 problem -- SGU 107
    (最短路 dijkstra)昂贵的聘礼 -- poj -- 1062
    (欧拉公式 很水) Coprimes -- sgu -- 1002
    (广搜) Find a way -- hdu -- 2612
  • 原文地址:https://www.cnblogs.com/lisuyun/p/5885524.html
Copyright © 2011-2022 走看看