邪恶八进制信息安全团队技术讨论组's Archiver

k2k 2005-7-22 18:06

[转载]Unicode和ASCII的转换

文章翻译:梁振
信息来源:[url]http://www.codersource.net/win32_unicode_ascii.html[/url]

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类型

[code]//判断字符集类型的函数

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

}[/code]



上面这个函数打开文件使用通常的fopen方法和检查第一个字节是Unicode还是ASCII,如果是Unicode返回2。这个返回值可以修改其他任何值并且使用技数值。使用这个函数可以检查文本的类型。



[code]//转换到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; //返回文件名

    }

} [/code]
     第二,ConvertFile函数,
    1. 获得一个输入文件名
    2. 检查如果是是Unicode字符集
    3. 在Window\Temp目录下建立一个ASCII文件
    这些函数能共同使用在一个ASCII应用程序中。特别是在写有老代码的ASCII 文件中和由于扩展的应用程序而让输入文件改为UNICODE文件。

页: [1]
© 1999-2008 EvilOctal Security Team