创建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接口,具体写入到文件中的内容是由文件的格式决定,并非调用的接口决定。
创建Unicode格式的INI文件的更多相关文章
- C# 如何实现完整的INI文件读写类
作者: 魔法软糖 日期: 2020-02-27 引言 ************************************* .ini 文件是Initialization File的缩写,即配置文 ...
- Delphi操作Ini文件
Delphi提供了一个TInifile类,使我们可以非常灵活的处理INI文件 一.INI文件的结构[小节名]ini文件 关键字1=值1 关键子2=值2INI文件允许有多个小节, ...
- C语言实现 读取写入ini文件实现(转)
#include <stdio.h> #include <string.h> /* * 函数名: GetIniKeyString * 入口参数: title * 配置文件中一组 ...
- delphi读取ini文件
ini文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如vb.vc.vfp.delphi等都提供了读写ini文件的方法,其中delphi中操作ini文件,最为简洁, ...
- ini文件多了个dos的^M结尾符号,导致linux下脚本程序不能运行
[omcr@lnlte2dmr-tdl legacy]$ cat -A ums_del_mr_files_cfg.ini MrFileDiskMountPoint=/home^M$ MrFileDis ...
- delphi INI文件
INI 文件读写 filecreate('路径加文件名')://创建一个文件. (1) INI文件的结构: ;这是关于INI文件的注释部分 [节点] 关键字=值 ... INI文件允许有多个节点,每个 ...
- php归档格式:phar文件详解(创建、使用、解包还原提取)
转载一篇,突然遇到一个冷知识,phar的东东,貌似和jar.war是一种鬼. 重点使用一下下面这个东东,就能解包出来东东了. $phar = new Phar('lib/yunke.phar', 0) ...
- pycharm新建ini文件或创建ini文件失败
1.pycharm创建ini格式的文件,没有对应的 ini 文件类型-------需要更新 Ini 2.setting–>marketplace 搜索 Ini ,然后进行安装,重启pycharm ...
- 使用java 程序创建格式为utf-8文件的方法(写入和读取json文件)
使用java 程序创建格式为utf-8文件的方法: try{ File file=new File("C:/11.jsp"); ...
随机推荐
- ES(二):Kibana
Kibana是一个基于浏览器页面的Elasticsearch前端展示工具.Kibana全部使用HTML语言和Javascript编写的,查询语法是基于Lucene的查询语法.允许布尔运算符.通配符和字 ...
- [Spring MVC] - view的redirect和forward
可以通过redirect/forward:url方式转到另一个Action进行连续的处理.可以通过redirect:url 防止表单重复提交 .写法如下:return "forward:/o ...
- DES,AeS加解密,MD5,SHA加密
1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...
- MVC+EasyUI 菜单导航的实现
一个简单的使用mvc+easyUi 动态菜单显示 直接上代码 前端 function initMenu() { $.get("/Admin/Home/GetNav", functi ...
- OAF_开发系列26_实现OAF中Java类型并发程式开发oracle.apps.fnd.cp.request(案例)
20150730 Created By BaoXinjian
- java 记事本 - 实例
记事本记事本实例中使用了以下知识1.ui界面2.io流3.事件监听4.图形5.JFileChooser 类,用于打开文件,另存为文件.弹出文件选择器对话框 学习重点:JFileChooser,有很多方 ...
- tornado api 简单模板
# 安装 pip insatll tornado # 主文件 web_server.py #!/usr/bin/env python # encoding: utf-8 import tornado. ...
- github代码集合(转载)
菜鸟新闻项目课程源码 https://github.com/yxs666/cniao5-news SwipeRefreshLayout + RecyclerView 下拉刷新和上拉加载更多 http ...
- MyEclipse中代码格式化后自动换行
MyEclipse的默认设置里面各种坑人,怎么不方便怎么设置,用户体验差到极点.今天又遇到个问题,按下Ctrl + Shift + F 后,自动格式化后的代码原来只有一行,结果变成了3行,看着都想吐. ...
- Python爬虫学习1
#coding=utf-8 from urllib2 import urlopen from bs4 import BeautifulSoup import urllib2 url="htt ...