Преобразование в UTF-8 из ToUnicodeEx ()

Я получаю ввод с помощью GetAsyncKeyState (), который затем конвертирую в Unicode с помощью ToUnicodeEx ():

wchar_t character[1];
ToUnicodeEx(i, scanCode, keyboardState, character, 1, 0, layout);

Я могу записать это в файл с помощью wfstream следующим образом:

wchar_t buffer[128]; // Will not print unicode without these 2 lines
file.rdbuf()->pubsetbuf(buffer, 128);
file.put(0xFEFF); // BOM needed since it's encoded using UCS-2 LE
file << character[0];

Когда я открываю этот файл в Notepad ++, он находится в формате UCS-2 LE, когда я хочу, чтобы он был в формате UTF-8. Я считаю, что ToUnicodeEx () возвращает его в формате UCS-2 LE, он также работает только с широкими символами. Есть ли способ сделать это с помощью fstream или wfstream, сначала каким-то образом преобразовав в UTF-8? Спасибо!


person Alexander Haselton    schedule 20.04.2018    source источник
comment
ToUnicodeEx, чтобы получить UTF-16LE, затем WideCharToMultiByte, чтобы получить UTF-8   -  person Richard Critten    schedule 20.04.2018
comment
stackoverflow.com/a/3999597/4454124   -  person mnistic    schedule 20.04.2018


Ответы (3)


Возможно, вы захотите использовать WideCharToMultiByte функция.

Например:

wchar_t buffer[LEN]; // input buffer
char output_buffer[OUT_LEN]; // output buffer where the utf-8 string will be written
int num = WideCharToMultiByte(
    CP_UTF8,
    0,
    buffer,
    number_of_characters_in_buffer, // or -1 if buffer is null-terminated
    output_buffer,
    size_in_bytes_of_output_buffer,
    NULL,
    NULL);
person SirDarius    schedule 20.04.2018

Windows API обычно называет UTF-16 unicode, что немного сбивает с толку. Это означает, что большинство вызовов функций Unicode Win32 работают со строками utf-16 или выдают их.

Итак, ToUnicodeEx возвращает строку utf-16.

Если вам это нужно как utf 8, вам необходимо преобразовать его с помощью WideCharToMultiByte

person Mike Vine    schedule 20.04.2018

Спасибо за всю помощь, мне удалось решить мою проблему с помощью дополнительной помощи из сообщения в блоге о WideCharToMultiByte () и UTF-8 здесь.

Эта функция преобразует массивы широких символов в строку UTF-8:

// Takes in pointer to wide char array and length of the array
std::string ConvertCharacters(const wchar_t* buffer, int len)
{
    int nChars = WideCharToMultiByte(CP_UTF8, 0, buffer, len, NULL, 0, NULL, NULL);

    if (nChars == 0)
    {
        return u8"";
    }

    std::string newBuffer;
    newBuffer.resize(nChars);
    WideCharToMultiByte(CP_UTF8, 0, buffer, len, const_cast<char*>(newBuffer.c_str()), nChars, NULL, NULL);
    return newBuffer;
}
person Alexander Haselton    schedule 20.04.2018