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

创建Unicode格式的INI文件的更多相关文章

  1. C# 如何实现完整的INI文件读写类

    作者: 魔法软糖 日期: 2020-02-27 引言 ************************************* .ini 文件是Initialization File的缩写,即配置文 ...

  2. Delphi操作Ini文件

    Delphi提供了一个TInifile类,使我们可以非常灵活的处理INI文件 一.INI文件的结构[小节名]ini文件       关键字1=值1       关键子2=值2INI文件允许有多个小节, ...

  3. C语言实现 读取写入ini文件实现(转)

    #include <stdio.h> #include <string.h> /* * 函数名: GetIniKeyString * 入口参数: title * 配置文件中一组 ...

  4. delphi读取ini文件

    ini文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如vb.vc.vfp.delphi等都提供了读写ini文件的方法,其中delphi中操作ini文件,最为简洁, ...

  5. ini文件多了个dos的^M结尾符号,导致linux下脚本程序不能运行

    [omcr@lnlte2dmr-tdl legacy]$ cat -A ums_del_mr_files_cfg.ini MrFileDiskMountPoint=/home^M$ MrFileDis ...

  6. delphi INI文件

    INI 文件读写 filecreate('路径加文件名')://创建一个文件. (1) INI文件的结构: ;这是关于INI文件的注释部分 [节点] 关键字=值 ... INI文件允许有多个节点,每个 ...

  7. php归档格式:phar文件详解(创建、使用、解包还原提取)

    转载一篇,突然遇到一个冷知识,phar的东东,貌似和jar.war是一种鬼. 重点使用一下下面这个东东,就能解包出来东东了. $phar = new Phar('lib/yunke.phar', 0) ...

  8. pycharm新建ini文件或创建ini文件失败

    1.pycharm创建ini格式的文件,没有对应的 ini 文件类型-------需要更新 Ini 2.setting–>marketplace 搜索 Ini ,然后进行安装,重启pycharm ...

  9. 使用java 程序创建格式为utf-8文件的方法(写入和读取json文件)

    使用java 程序创建格式为utf-8文件的方法:  try{            File file=new   File("C:/11.jsp");              ...

随机推荐

  1. Python error: Unable to find vcvarsall.bat

    在安装一些Python模块时,大部分是cpython写的模块时会发生如下错误 error: Unable to find vcvarsall.bat.先前的一篇文章:在Windows上安装Scrapy ...

  2. NetApp常用检查命令

    常用检查命令 ************************************* ******************************************************* ...

  3. BaiduTemplate模板引擎使用示例附源码

    1.新建项目,asp.net 空Web应用程序 添加data,js,styles,templates文件夹,添加baiduTemplate.js,jquery.js,bootstrap.css 2.添 ...

  4. My Open Source Projects

    • MyMagicBox (https://github.com/yaoyansi/mymagicbox)   Role: Creator   Miscellaneous projects for e ...

  5. ubuntu 彻底卸载软件

    找到此软件名称,然后sudo apt-get purge ......(点点为为程序名称),purge参数为彻底删除文件,然后sudo apt-get autoremove,sudo apt-get ...

  6. C语言中,定义的含义?声明的含义?它们之间的区别是什么?

    在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...

  7. SpringMvc JSON 406,吐血。。。。

    解决方法一: 1.导入jackson-core-2.5.1.jar和jackson-databind-2.5.1.jar 2.Spring配置文件添加: 1 spring3为:org.springfr ...

  8. 【转】 java web开发之安全事项

    从事java web开发也有几年了,可是开发中的安全问题却越来越不以为然.直到不久遇到一黑软,瞬间sql注入,少时攻破网站数据库.还好,我还没有用root级的用户连接数据库.不过也没有什么用了,因为我 ...

  9. viewPager--viewpager时,发生内存溢出OOM问题

    两个问题:1.如果图片达到500kb每张,你这个划屏会有顿卡:2.快速滑动有出现0.几秒的白屏.图片越大,顿卡越明显. 回复parcool:500kb的背景算大的了,如果是想做图片墙,viewpage ...

  10. linux中终端控制键Ctrl+C,Ctrl+Z,Ctrl+D的使用场合

    1.Ctrl+C比较暴力,就是发送Terminal到当前的程序,比如你正在运行一个查找功能,文件正在查找中,Ctrl+C就会强制结束当前的这个进程.2.Ctrl+Z是把当前的程序挂起,暂停执行这个程序 ...