【问题标题】:How to make ::WriteFile work in UNICODE circumstance?如何使 ::WriteFile 在 UNICODE 情况下工作?
【发布时间】:2012-04-09 16:18:36
【问题描述】:

由于我的 MFC 程序处于 unicode 环境,因此下面的代码无法正常工作。

::WriteFile(hFile, TEXT("123456"), lstrlenW(TEXT("123456")), &dwByte, nullptr);
::CloseHandle(hFile);

结果是“123”,应该是“123456”

我在互联网上发现 Unicode BOM 可以解决这个问题。 所以我修改了我的代码,如下所示。

WORD Unicode = 0xfeff; // UNICODE BOM
::WriteFile(hFile, &Unicode, 2, &dwByte, nullptr);
::WriteFile(hFile, TEXT("123456"), lstrlenW(TEXT("123456")), &dwByte, nullptr);
::CloseHandle(hFile);

但是,它没有任何区别。

这似乎是一个简单的问题,但我正在寻找解决方案。

任何想法都会受到欢迎。提前致谢。

【问题讨论】:

    标签: c++ unicode mfc mbcs


    【解决方案1】:

    您不想使用lstrlenW 来确定要写入的数据量——您需要告诉WriteFile 要写入的字节数,而不是代码点数。现在,你告诉它 6 个字节,这对于 3 个字符来说已经足够了。

    【讨论】:

      【解决方案2】:

      Writefile 不写“文本”:它写“字节”。 lstrlenW 返回wchar_t 的数量。 您应该乘以sizeof(wchar_t),以便为第三个参数提供“要写入的字节数数”

      【讨论】:

      • TEXT()charwchar_t 进行操作,具体取决于是否定义了UNICODE,但lstrlenW() 仅对wchar_t 进行操作。如果您希望代码在两种环境中都运行,请改用lstrlen()sizeof(TCHAR),例如:WriteFile(hFile, TEXT("123456"), lstrlen(TEXT("123456")) * sizeof(TCHAR), ...)
      • @RemyLebeau - 再次正确...不错!
      猜你喜欢
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多