文章翻译:梁振
信息来源:
http://www.codersource.net/win32_unicode_ascii.html
Unicode编程在Windows下使用更加容易了,但还是有需要一些奇怪代码例子。
通常情况下在MFC下做Unicode编程将使用下面的方法:
1,构造使用TCHAR类型的申明
2,使用所有函数涉及TCHAR
3,使用一个#define定义Unicode
既然在MFC框架中将自动转换字符串到Unicode 这样是被遵循的。如果没有"#define unicode", 这时候所有的字符串将按照ASCII 来处理。
在这里有一些著名的操作系统这方面的内容:
如果操作系统是MS-Windows 95 以前的,默认字符串只有ASCII,即使你发送UNICODE 字符串,它也将被转换到ASCII, 去执行和操作,最后转换回UNCIODE的值。
如果是操作系统是WindowsNT或2000就不同了,即使你编写的代码是ASCII 代码,它将被转换为UNICODE 字符串,在执行和操作完成后,再转换回ASCII 。
在有些情况下我们不得不必需将UNICODE 文件转换为ASCII文件。这些情况发生是在应用程序不能处理Unicode并且需要处理我们仅存在的Unicode文件。
下面这个实例就是上述的环境下由Unicode转换到ASCII类型
复制内容到剪贴板
代码:
//判断字符集类型的函数
int IsUnicodeFile(char* szFileName) //指定一个 Unicode 文件
{
FILE *fpUnicode; //定一个文件
char l_szCharBuffer[80]; //ASCII缓存字符数组
if((fpUnicode= fopen(szFileName,"r")) == NULL){ // 不能打开该文件
return 0; //Unable to open file //返回空
}
if(!feof(fpUnicode)) //可以打开该文件
{
fread(l_szCharBuffer,80,1,fpUnicode); //读取 80 个字符内容到缓存字符数组
fclose(fpUnicode);//关闭文件
if(IsTextUnicode(l_szCharBuffer,80,NULL))//判断如果是 Unicode
{
return 2; //返回 2,表示是 Unicode
}
else //如果不是 Unicode,就是 ASCII
{
return 1; //返回 1,表示为 ASCII
}
}
return 0; // 出现一些错误,返回 0
}上面这个函数打开文件使用通常的fopen方法和检查第一个字节是Unicode还是ASCII,如果是Unicode返回2。这个返回值可以修改其他任何值并且使用技数值。使用这个函数可以检查文本的类型。
复制内容到剪贴板
代码:
//转换到ASCII 字符串
CString ConvertFile(char *szFileName)
{
CString strTempFileName ; //定义一个 CString 字符串,用于临时文件名
CString strInputFileName; // 定义一个CString 字符串,用于输入
strInputFileName = szFileName; //输入字符串设置为传入参数
char TempPathBuffer[255]; // 临时路径缓存字符数组
GetTempPath(255,TempPathBuffer); //获得路径信息到字符数组
FILE *fpASCII; // 文件类
CStdioFileEx fpUnicode; // 定义C 运行时的流文件
strTempFileName = TempPathBuffer; //定义文件路径
strTempFileName += "TempUnicodecheck.txt"; //文件名
if(IsUnicodeFile(szFileName) == 2) {//判断是否是 Unicode
if(!fpUnicode.Open(szFileName,CFile::modeRead|CFile::typeBinary))
//打开该文件,使用二进位的方法读取不成功
{
printf("Unable to open the unicode file\n");// 打印错误报告
return strInputFileName ;//返回文件名
}
if((fpASCII = fopen(strTempFileName.operator LPCTSTR(),"w+"))==NULL)
//如果新建临时文件失败
{
fpUnicode.Close();//关闭流文件
printf("Unable to open the output file\n");
return strInputFileName;
}
CString strData;//Cstring 类型定义的字符串
while(fpUnicode.ReadString(strData))// 读取字符串
{
strData += "\n";
fwrite(strData,sizeof(char),strData.GetLength(),fpASCII);// 读取部分转换为 ASCII
}
fflush(fpASCII); //Flush 流
fclose(fpASCII);// 关闭所有的流
fpUnicode.Close();// 关闭流
return strTempFileName;// 返回文件名
}
else //如果不是 Unicode 字符集
{
return strInputFileName; //返回文件名
}
} 第二,ConvertFile函数,
1. 获得一个输入文件名
2. 检查如果是是Unicode字符集
3. 在Window\Temp目录下建立一个ASCII文件
这些函数能共同使用在一个ASCII应用程序中。特别是在写有老代码的ASCII 文件中和由于扩展的应用程序而让输入文件改为UNICODE文件。