WriteFile(...) 将文件编码从 UTF-16 LE 更改为 UTF-8

问题描述 投票:0回答:1

我有 UTF-16 LE 文件。如果我将文本写入 .txt 文件,它就会变成 UTF-8。 代码:

hFile = CreateFile(TEXT("D:\\clown.txt"), GENERIC_READ | GENERIC_WRITE,  FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
    wsprintf(buffer, TEXT("ERROR CODE: %i"), GetLastError());
    MessageBox(NULL, buffer, TEXT("Error"), MB_OK | MB_ICONERROR);
    return 0;
}
MessageBox(NULL, TEXT("hFile was created"), TEXT("Successfully"), MB_OK);
sBuff = GetWindowText(hEdit, buffer, BUFFER_SIZE);
if (!WriteFile(hFile, buffer, sBuff * 2, &i, NULL))
{
    wsprintf(buffer, TEXT("ERROR CODE: %i"), GetLastError());
    MessageBox(NULL, buffer, TEXT("Error"), MB_OK | MB_ICONERROR); 
    return 0;
}
wsprintf(buffer, TEXT("%i"), GetLastError());
MessageBox(NULL, buffer, TEXT("Successfully"), MB_OK);
CloseHandle(hFile);
return 0;

WriteFileEx 有同样的问题

api file winapi encoding byte-order-mark
1个回答
0
投票

打开文件后可以调用

_setmode
将文件模式设置为
_O_U16TEXT
,即UTF-16 LE。默认情况下,CreateFile 以 ANSI 模式打开文件,该模式在写入时将 UTF-16 转换为 UTF-8。
_setmode
将其更改为 UTF-16 模式,以便保留文本编码。

 // Ensure file is opened in UTF-16 LE mode
 _setmode(_fileno(hFile), _O_U16TEXT); 

这也可能有帮助:

https://github.com/DanielRabl/QPL/blob/b2b1f97fe53d412f04f3635defc76bf8ef29a1f8/src/qpl/winsys.cpp

© www.soinside.com 2019 - 2024. All rights reserved.