none
MultiByteToWideChar溢出BUG RRS feed

  • 问题

  • //----------------------------------------------------------------------------
    // FUNCTION: ConvertUTF8ToUTF16
    // DESC: Converts Unicode UTF-8 text to Unicode UTF-16 (Windows default).
    //----------------------------------------------------------------------------
    LPWSTR UTF8Encoding::GetString(const MemoryStream &stream)
    {
      LPSTR pszTextUTF8 = (LPSTR)stream.m_ptr;
    
      // Convert to 'int' for use with MultiByteToWideChar API
      int cbUTF8 = static_cast<int>(stream.m_size);
      
      // Get size of destination UTF-16 buffer, in WCHAR's
      int cchUTF16 = MultiByteToWideChar(
              CP_UTF8,        // convert from UTF-8
              MB_ERR_INVALID_CHARS,  // error on invalid chars
              pszTextUTF8,      // source UTF-8 string
              cbUTF8,         // total length of source UTF-8 string, in CHAR's (= bytes), including end-of-string \0
              NULL,          // unused - no conversion done in this step
              0            // request size of destination buffer, in WCHAR's
              );
      if ( cchUTF16 == 0 )
      {
        return NULL;
      }
    
      // Allocate destination buffer to store UTF-16 string
      WCHAR * pszUTF16 = this->m_Buffer->Get((cchUTF16));
      if(pszUTF16 == NULL)
      {
        return NULL;
      }
    
      // Do the conversion from UTF-8 to UTF-16
      int result = MultiByteToWideChar(
             CP_UTF8,        // convert from UTF-8
             MB_ERR_INVALID_CHARS,  // error on invalid chars
             pszTextUTF8,      // source UTF-8 string
             cbUTF8,         // total length of source UTF-8 string, in CHAR's (= bytes), including end-of-string \0
             pszUTF16,        // destination buffer
             cchUTF16        // size of destination buffer, in WCHAR's
             );
      if ( result == 0 )
      {
        return NULL;
      }
    
      // Return resulting UTF16 string
      return pszUTF16;
    }

     

    上面这段代码(修改自http://msmvps.com/blogs/gdicanio/archive/2010/01/04/conversion-between-unicode-utf-16-and-utf-8-in-c-win32.aspx)会报写入异常。

    原因可能是
    1.第一次MultiByteToWideChar返回的cchUTF16不准确.如果将得到的cchUTF16乘以2再去分配内存就没有该异常.

    2.第二次MultiByteToWideChar写入时溢出,但是引发异常断下后,发现pszUTF16已经有一部分正确的数据,但不完整,继续执行就报异常了.


    比如说第一次调用MultiByteToWideChar返回的cchUTF16是2

    申请到的pszUTF16地址为0x00000000

    但第二次调用MultiByteToWideChar却一直写到了0x00000002上,故异常(分配的内存大小为2,所以0x00000000-0x00000001才是可读写的).

    不知为何?BUG?

    • 已编辑 RLib 2011年6月29日 13:02 edit
    2011年6月29日 13:00

答案

  • If your memory allocator works in bytes, you will need to modify it so that it allocates enough by using (ccUTF16 * sizeof(wchar_t)).
    rrrfff
    • 已标记为答案 RLib 2011年6月29日 13:55
    2011年6月29日 13:54

全部回复

  • If your memory allocator works in bytes, you will need to modify it so that it allocates enough by using (ccUTF16 * sizeof(wchar_t)).
    rrrfff
    • 已标记为答案 RLib 2011年6月29日 13:55
    2011年6月29日 13:54
  • 你好,

     

    很高兴能够听到你已经通过自己的努力结局了您的问题。并感谢您能够在这里分享您的解决方案。这会与您有相同或者类似问题的用户有着莫大的帮助。

    谢谢


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月1日 3:22