2 qq 30084517 qq_30084517 于 2016.09.24 18:51 提问

C++使用FILE类保存的数据乱码

图片说明
txt文件是UTF-8的,改为ANSI可以,但是能不能不改文件编码,程序解决?

1个回答

qq_30084517
qq_30084517   2016.09.24 21:02
已采纳

如果原字符是Unicode编码,使用WideCharToMultiBytes,使用UTF8代码页

如果是ansi编码的则先使用MultiBytesToWideChar转换为Unicode编码,再按上述操作完成
//把utf8转成unicode,再转成cstring

void ConvertUTF8ToANSI(char* strUTF8,CString &strANSI) //

{

int nLen = ::MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,(LPCTSTR)strUTF8,-1,NULL,0);  //返回需要的unicode长度  

WCHAR * wszANSI = new WCHAR[nLen+1];  

memset(wszANSI, 0, nLen * 2 + 2);  

nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8, -1, wszANSI, nLen);    //把utf8转成unicode  



nLen = WideCharToMultiByte(CP_ACP, 0, wszANSI, -1, NULL, 0, NULL, NULL);        //得到要的ansi长度  

char *szANSI=new char[nLen + 1];  

memset(szANSI, 0, nLen + 1);  

WideCharToMultiByte (CP_ACP, 0, wszANSI, -1, szANSI, nLen, NULL,NULL);          //把unicode转成ansi  

strANSI = szANSI;  

delete wszANSI;  

delete szANSI;  

}

void ConvertANSIToUTF8(CString &strANSI)

{

int nLen = ::MultiByteToWideChar(CP_ACP,MB_ERR_INVALID_CHARS,(LPCTSTR)strANSI,-1,NULL,0);

unsigned short * wszUTF_8 = new unsigned short[nLen+1];

memset(wszUTF_8, 0, nLen * 2 + 2);

nLen = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strANSI, -1, wszUTF_8, nLen);

nLen = WideCharToMultiByte(CP_UTF8, 0, wszUTF_8, -1, NULL, 0, NULL, NULL);

char *szUTF8=new char[nLen + 1];  

memset(szUTF8, 0, nLen + 1);  

WideCharToMultiByte (CP_UTF8, 0, wszUTF_8, -1, szUTF8, nLen, NULL,NULL);  

strANSI = szUTF8;

delete wszUTF_8;

delete szUTF8;

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
file保存成blob
1 model private Blob xlsfile; public Blob getXlsfile() {   return xlsfile;  }  public void setXlsfile(Blob xlsfile) {   this.xlsfile = xlsfile;  }   2 映射   3.file转byte[] public static by
解决mysql保存中文数据乱码
1、到安装目录修改my.ini文件, 将文件中下面的变量改成如下[mysql] default-character-set=gbk [mysqld] character-set-server=utf8 重新启动服务,最后得出经验时只要把导入与导出编码统一一下就没问题了。 2、数据库的编码: 在sqlyog工具中操作把,右击数据库点击更改数据库,如图: 设置就可
文件类File(基础)
存储在变量、数组和对象中的数据是暂时的,当程序终止时它们就会丢失。为了能够永久地保存程序中创建的数据,需要将他们存储到磁盘或光盘上的文件中。这些文件可以传送,也可以随后被其他程序使用。本次主要学习使用File类获取文件的属性以及删除和重命名文件。 在文件系统中,每个文件都存放在一个目录下。绝对文件名(absolute file name) 是由 文件名和它的完整路径以及驱动器字母组成。例如,c:\
include file="*.html" 时出现乱码解决方案
问题描述:%@ include file="*.html" %> 的中文乱码问题要解决这个问题,当然最简单的就是在每个被 include 的文件第一行,加上%@ page contentType="text/html;charset=gb2312" %>这样一定可以确保中文 jsp 档不会出现乱码,只不过,一旦程序修改成这样的模式,这种程序就无法在旧的 jsp/servlet cont
黑马程序员——乱码打印file
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------import java.io.*; /* * 定义一个文件输入流,调用read(byte[] b)方法将exercise.txt文件中的所有内容打印出来(byte数组的大小限制为5,不考虑中文编码问题)。 */ public class Printfile { public static
数据---File
Android中文件的存储操作: Activity的openFileOutput()方法可以用于把数据输出到文件中创建的文件保存在/data/data//files目录实现过程与在Java中保存数据到文件中是一样的 创建文件: File file = new File("/mnt/sdcard/test");//此为内置目录,外置目录为/mnt/extsdcard/test if(!fi
java 操作文件File类
File 文件类 用来将文件或者文件夹封装成为对象。 方便对文件与文件夹的属性信息进行操作。 File对象可以作为参数传递给流的构造函数。 File 类的常用的方法。import java.io.*; /*File类的常见方法 1.创建。 boolean createNewFile(); boolean mkdir();创建文件夹 boolean mkdirs();
保存BitMap,File到本地
保存BitMap到本地/** * * * @param context * @param mBitmap * @return */ public static String saveBitmap(Context context, Bitmap mBitmap) { String savePath = null; File filePic; if (Envir...
android中file的保存
代码如下: 布局代码略: 1.Activity代码如下: public class MainActivity extends Activity {         @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceStat
Android数据持久化保存--File
//系统清理缓存的时候,内部存储私有目录cache下的文件和外部存储私有目录cache下的文件都被清除 //系统清除数据的时候,内部存储私有目录和外部存储私有目录下的文件都被清除 //openFileOutput在getFilesDir()目录下打开或者创建文件,文件不存在的时候则创建文件 //getFilesDir()目录可以存放持久文件,只要应用不卸载,但是这个目录我们看不见,因为它属于内部存...