mfc编程CFile类Write函数问题!
此前用CFileDialog获得了一个文件路径"C:\Users\kk\Desktop\丝路.mp3",后来把"丝路.mp3"分离出来存在一个变量musicName中,然...
此前用CFileDialog获得了一个文件路径"C:\Users\kk\Desktop\丝路.mp3",后来把"丝路.mp3"分离出来存在一个变量musicName中,然后用CFile file;
BOOL bResult =file.Open("D:\\a.txt",CFile::modeCreate|CFile::modeWrite);
file.Write(musicName,musicName.GetLength());
file.Close();
但是文件存储的结果是"˿·.mp3",这是怎么回事? 展开
BOOL bResult =file.Open("D:\\a.txt",CFile::modeCreate|CFile::modeWrite);
file.Write(musicName,musicName.GetLength());
file.Close();
但是文件存储的结果是"˿·.mp3",这是怎么回事? 展开
1个回答
展开全部
你的程序没有错。简体中文字符集中"丝路.mp3"的16进制表示为CB BF C2 B7 2E 6D 70 33,这串东西有二义性,它除了能被按照简体中文字符集(GB2312)解释为"丝路.mp3",还能按照UTF-8格式被解释为"˿·.mp3"。如果你用notepad.exe打开a.txt,它按UTF-8解释,而用写字板软件或IE浏览器,则按GB2312显示。而如果用更聪明的Word来打开,则会让你在两种字符编码中做出选择。这个棘手问题(出现机率很低,丝路是个很特殊的词,你可以试验在notepad.exe中输入“丝路”,按保存,关闭再打开就显示成了˿· ,不过若另存为Unicode编码的,则显示正确)解决方法就是在程序中使用Unicode编码(UTF-16)。
追问
我擦,还有这事!早知道不拿这首歌做实验了! 我昨天以为程序有错弄了两个小时也没弄好,不过好在写进去是"˿·",用read函数读出来还是丝路. 那我已经建完工程了,当时没勾选Unicode编码,我现在还能勾选Unicode么?在哪弄啊?
追答
能。你写的是mfc程序,所以只要在stdafx.h中加入
#define UNICODE
#define _UNICODE
这两行,程序就自动转化为用UNICODE版本MFC编写的。必须在stdafx.h中包含任何其他头文件之前定义这两个宏。不过这样就有个新问题,你把UNICODE编码的字符写入txt文件但是notepad.exe打开文件不知道要用UNICODE编码去分析字符,一般来说还是乱码。必须在文件开头写入两个16进制数字FF FE ,当notepad.exe在txt文件开头看到这两个数字时他会把后面的数据按照UNICODE编码解释。
用UNICODE编码存字符的好处是世界大多数语言文字可以同时存储显示,坏处是占用空间较多。
如果你的程序中有MFC以外的内容,例如调用了C语言库函数或C++库,那么可能需要做一些修改才能适应UNICODE宏的定义。这些你按照编译后出现的error一个一个去修改就可以了。
在程序中使用时,不能用普通ANSI字符串"丝路" ,而要用UNICODE字符串 L"丝路",即在普通字符串字面量之前加上大写字母L转化为UNICODE字符串。
你可以参考Jeffrey Richter 《Windows核心编程第五版》第二章来详细了解UNICODE编程
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询