前段时间由于开发一个软件,需要调用别人的接口,虽然我的软件是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. java 读取带section_手把手教你实现类似ini4j的方式创建读取和修改.ini文件(支持section)...

    背景 由于这次任务是和c语言合作编写的,刚开始使用ini4j来操作.ini文件,然后由于ini4j对存储的数据做了转义处理,导致c无法正常读取,他们也是采用开源的框架,然后由于java方只有我一个人, ...

  2. Python XlsxWriter创建xlsx格式的Excel文件

    简介 XlsxWriter是用来创建XLSX格式的Excel模块. 样例 import xlsxwriter# Create a workbook and add a worksheet.workbo ...

  3. 通过kvm创建qcow2格式的镜像文件

    1.创建kvm虚拟机 virt-install --name=analyzer1 --vcpus=4 --ram=8192  --disk path=/data/kvm/images/analyzer ...

  4. C/C++ 操作ini文件(SinpleIni 跨平台库)

    最近在学习时,发现自己还不会操作ini文件,想着以前工作时接触到的项目或多或少都要用到ini文件去保存初始化程序的数据:所以赶紧去网上搜索以下C/C++操作ini文件都有些什么库可以玩玩:搜索到有: ...

  5. 在.NET中读写INI文件 ——兼谈正则表达式的应用

    INI文件是Windows平台上的一种较常用的软件配置文件格式,Windows应用程序常常使用它来保存一些配置信息.它一般是由数个包含key-value对的Section组成,每个key-value对 ...

  6. C++,ini文件操作(包含类)

    什么是ini文件? initialization File,即为初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置.或者作为项目中的配置文件,为整个项目所共用. ...

  7. MFC操作ini文件方法

    转载:https://blog.csdn.net/rayborn1105/article/details/8192142 在我们的程序设计中经常需要对一些参数进行配置,配置好后还要在下一次启动仍然有效 ...

  8. 使用GDAL创建Erdas格式的金字塔

    在使用Erdas或者ArcGIS打开栅格图像的时候,会创建一个后缀名为rrd的金字塔文件,用于快速显示图像.那么在使用GDAL编写自己的图像算法后,像快速的在Erdas或者ArcGIS中显示,就需要自 ...

  9. 使用OGR创建dxf格式矢量数据

    使用OGR库创建DXF格式的数据和创建Shp格式的数据基本一样,代码除了注册驱动不一样之外,其他的完全一样. 需要注意的是,OGR创建DXF格式需要data文件夹下的head.dxf,所以首先要设置G ...

最新文章

  1. bzoj:1221;vijos 1552 软件开发
  2. 自学python要看哪些书籍-Python入门自学到精通需要看哪些书籍?
  3. copyMakeBorder函数
  4. html5_0_文章_分级_分段
  5. 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
  6. Python3 爬虫学习笔记 C15【代理的基本使用】
  7. 十几个NPM恶意包劫持 Discord 服务器
  8. 软件技术毕业论文编程方向
  9. ABB机器人DSQC406 3HAC036301-00104伺服驱动器故障报警维修
  10. SetProcessWorkingSetSize 和内存释放
  11. spring boot集成redis
  12. Android P 禁用OTG U盘使用
  13. 运营小技能:自定义公众号菜单模版(带有文章分类栏目、内容列表)、获取历史页面
  14. kali mysql安装教程_MySQL 安装教程(windows版)
  15. 软件测试周刊(第61期):内心强大的人都有三个共性「不和他人作比较」「不对他人有期待」「不批判他人」
  16. UART、SPI、I2C串行通讯协议解释 同步/异步 全双工/半双工通信含义
  17. node.js的下载安装详细步骤(还有安装配套的express、淘宝镜像、webpack、Vue)
  18. MATLAB--数字图像处理 Otsu算法(MATLAB原理验证)
  19. 自动控制原理笔记-传递函数
  20. matlab 变调器,个人改动后的语音变速变调的程序

热门文章

  1. 微信小程序长按保存图片
  2. 【TypeScript】箭头函数
  3. 【新星计划】Matlab绘制分岔图
  4. webpack4.x Loaders
  5. 杰奇linux伪静态,常用的13个.htaccess重写URL的伪静态规则
  6. php 预处理原理,PHP的PDO对象预处理的2种实现方法,实现原理详解
  7. 数据结构实验之数组三:快速转置
  8. 《漫画算法》源码整理-2 数组 链表 队列
  9. mysql截取字符串函数left和right和substring和substring_index
  10. 理解Java NIO