我的程序里将要从网关得到一些Unicode码字符串,可能包含字母,数字和汉字,现要把他们转化为ansi码字符串,有什么好的准确的办法吗?
我之前用的是WideCharToMultiByte函数,但好像效果不好,不知是不是用法不当?

解决方案 »

  1.   

    我就是用的WideCharToMultiByte啊,没有什么问题!
      

  2.   


    BOOL FileReverse(PCTSTR pszPathname, PBOOL pfIsTextUnicode) {   *pfIsTextUnicode = FALSE;  // Assume text is Unicode   // Open the file for reading and writing.
       HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0, 
          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);   if (hFile == INVALID_HANDLE_VALUE) {
          chMB("File could not be opened.");
          return(FALSE);
       }   // Get the size of the file (I assume the whole file can be mapped).
       DWORD dwFileSize = GetFileSize(hFile, NULL);   // Create the file-mapping object. The file-mapping object is 1 character 
       // bigger than the file size so that a zero character can be placed at the 
       // end of the file to terminate the string (file). Because I don't yet know
       // if the file contains ANSI or Unicode characters, I assume worst case
       // and add the size of a WCHAR instead of CHAR.
       HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 
          0, dwFileSize + sizeof(WCHAR), NULL);   if (hFileMap == NULL) {
          chMB("File map could not be opened.");
          CloseHandle(hFile);
          return(FALSE);
       }   // Get the address where the first byte of the file is mapped into memory.
       PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);   if (pvFile == NULL) {
          chMB("Could not map view of file.");
          CloseHandle(hFileMap);
          CloseHandle(hFile);
          return(FALSE);
       }   // Does the buffer contain ANSI or Unicode?
       int iUnicodeTestFlags = -1;   // Try all tests
       *pfIsTextUnicode = IsTextUnicode(pvFile, dwFileSize, &iUnicodeTestFlags);   if (!*pfIsTextUnicode) {
          // For all the file manipulations below, we explicitly use ANSI 
          // functions because we are processing an ANSI file.      // Put a zero character at the very end of the file.
          PSTR pchANSI = (PSTR) pvFile;
          pchANSI[dwFileSize / sizeof(CHAR)] = 0;      // Reverse the contents of the file.
          _strrev(pchANSI);      // Convert all "\n\r" combinations back to "\r\n" to 
          // preserve the normal end-of-line sequence.
          pchANSI = strchr(pchANSI, '\n'); // Find first '\n'.      while (pchANSI != NULL) {
             // We have found an occurrence....
             *pchANSI++ = '\r';   // Change '\n' to '\r'.
             *pchANSI++ = '\n';   // Change '\r' to '\n'.
             pchANSI = strchr(pchANSI, '\n'); // Find the next occurrence.
          }   } else {
          // For all the file manipulations below, we explicitly use Unicode
          // functions because we are processing a Unicode file.      // Put a zero character at the very end of the file.
          PWSTR pchUnicode = (PWSTR) pvFile;
          pchUnicode[dwFileSize / sizeof(WCHAR)] = 0;      if ((iUnicodeTestFlags & IS_TEXT_UNICODE_SIGNATURE) != 0) {
             // If the first character is the Unicode BOM (byte-order-), 
             // 0xFEFF, keep this character at the beginning of the file.
             pchUnicode++;
          }      // Reverse the contents of the file.
          _wcsrev(pchUnicode);      // Convert all "\n\r" combinations back to "\r\n" to 
          // preserve the normal end-of-line sequence.
          pchUnicode = wcschr(pchUnicode, L'\n'); // Find first '\n'.      while (pchUnicode != NULL) {
             // We have found an occurrence....
             *pchUnicode++ = L'\r';   // Change '\n' to '\r'.
             *pchUnicode++ = L'\n';   // Change '\r' to '\n'.
             pchUnicode = wcschr(pchUnicode, L'\n'); // Find the next occurrence.
          }
       }   // Clean up everything before exiting.
       UnmapViewOfFile(pvFile);
       CloseHandle(hFileMap);   // Remove trailing zero character added earlier.
       SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);
       SetEndOfFile(hFile);
       CloseHandle(hFile);   return(TRUE);
    }
    这是kernel prog里text to unicode的,可以照着画
      

  3.   

    int OleDBCom::UnicodeToChar(char *UnicodeText, char *ASCText, unsigned char UnicodeLength)
    {
    wchar_t UnicodeWCH[100];
    int MultiLength = 0;
    int WideLength = 0;
    unsigned char SMLength = 0;

    while(MultiLength < UnicodeLength)
    {
    UnicodeWCH[WideLength++] = ((unsigned char )UnicodeText[MultiLength] << 8) 
    + (unsigned char)UnicodeText[MultiLength+1];
    MultiLength += 2;
    }
    UnicodeWCH[WideLength] = 0;

    SMLength = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)UnicodeWCH, WideLength, 
    (LPSTR)ASCText, 161, NULL, NULL); return SMLength;
    }
      

  4.   

    看看下面几个帖子
    http://expert.csdn.net/Expert/topic/2045/2045301.xml?temp=.2868769
    http://expert.csdn.net/Expert/topic/2087/2087499.xml?temp=.3080561
    http://expert.csdn.net/Expert/topic/2086/2086274.xml?temp=.972851
      

  5.   

    Windows核心编程中有比较详细的介绍