可以使用 WriteFile() 将 wchar_t 个字符写入文件吗?

Can WriteFile() be used to write wchar_t characters to a file?

我正在尝试使用 WriteFile()wchar_t 类型的字符串写入文件。这是代码:

void main()
{
  wchar_t dataString[1024];

  HANDLE hEvent, hFile;
  DWORD dwBytesWritten, dwBytesToWrite;

  hFile = CreateFileW(L"e:\test.txt", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if(hFile == INVALID_HANDLE_VALUE)
  {
     printf("Invalid file handle: %d\n", GetLastError());
     return;
  }

  wcscpy(dataString, L"Hello");
  dwBytesToWrite = wcslen(dataString);
  WriteFile(hFile, (LPVOID )dataString, dwBytesToWrite, &dwBytesWritten, NULL);

  CloseHandle(hFile);

}

我希望将字符串 Hello 写入文件。但是文件中的输出是这样的:

H e l

知道为什么它没有将整个字符串 Hello 写入文件吗?

dwBytesToWrite = wcslen(dataString);

不是return字节数而是字符数。当您使用宽字符(每个字符 2 个字节)时,只有其中一些会写入文件。

试试这个:

dwBytesToWrite = wcslen(dataString) * sizeof(wchar_t);
  1. 添加字节顺序标记(参见:https://en.wikipedia.org/wiki/Byte_order_mark)(UTF-8(0xEF,0xBB,0xBF))在文本文件的开头
  2. 将字符串转换为 UTF-8 编码(https://en.wikipedia.org/wiki/UTF-8)。

尝试关注

/////////////        
{
unsigned char utf8BOM[3]={0xef,0xbb,0xbf};
unsigned int i=0;
DWORD bytesWrote;
unsigned int stringLen=wcslen(dataString);
WriteFile(hFile,utf8BOM,3,&bytesWrote,0);
unsigned int i=0;
while(i< stringLen){

    unsigned char buf3[3];
    if(((unsigned short)dataString[i])>0x7FF){
        buf3[0]=(0xe0 | (0x0F & (dataString[i]>>12)));
        buf3[1]=(0x80 | (0x03F & (dataString[i]>>6)));
        buf3[2]=(0x80 | (0x03F & (dataString[i])));
        WriteFile(hFile,buf3,3,&bytesWrote,0);
    }
    else{
        if(((unsigned short)dataString[i]) > 0x7F){
            buf3[0]=((dataString[i]>>6)&0x03) | 0xC0;
            buf3[1]=(dataString[i] & 0x3F) | 0x80;
            WriteFile(hFile,buf3,2,&bytesWrote,0);
        }
        else{
            buf3[0]=dataString[i];
            WriteFile(hFile,buf3,1,&bytesWrote,0);
        }
    }

    i++;
}
}
////////////////////