wstring проблема с кириллицей

262
02 декабря 2017, 09:47

Функция принимает на вход две части кода кириллицы (2 байта). Нужно преобразовать их в русский текст. Видимо я чего-то не понимаю, прошу помочь.

wstring cyrillic(string high, string low) {
    wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    wstring fPart = converter.from_bytes(high);
    wstring sPart = converter.from_bytes(low);
    wstring name = L"\\u" + fPart + sPart;
    return name;
}

На выходе получается строка, наподобие "\u0414". Хотя цель вывести "Д".

Answer 1

Как я понял, в каждой из строк передается шестнадцатеричное значение байта в кодировке UTF-16. Соответственно надо только преобразовать их в число и сложить:

#include <limits>
#include <memory>
#include <cassert>
#include <cstdint>
#include <cstdio>
bool
hex_to_byte(char const * const psz_value, ::std::uint32_t & value) noexcept
{
    return
    (
        (1 == ::sscanf_s(psz_value, "%x", ::std::addressof(value)))
        &&
        (value <= ::std::numeric_limits<::std::uint8_t>::max())
    );
}
wchar_t
cyrillic(char const * const psz_high, char const * const psz_low) noexcept
{
    wchar_t result{};
    ::std::uint32_t high{};
    ::std::uint32_t low{};
    if(hex_to_byte(psz_high, high) && hex_to_byte(psz_low, low))
    {
        result = static_cast<wchar_t>((high << 8) | low);
    }
    return(result);
}
int
main()
{
    assert(L'Д' == cyrillic("04", "14"));
    return(0);
}
READ ALSO
Удаление элемента из списка по значению переменной [требует правки]

Удаление элемента из списка по значению переменной [требует правки]

Как написать удаление элемента односвязного списка, если этот элемент - это значение переменной другого класса?

421
Разбить строку регулярным выражением

Разбить строку регулярным выражением

При составлении регулярного выражения не получается сохранить каждую часть входного путиВходная строка:

270
Повторный вызов функции меню

Повторный вызов функции меню

Подскажите пожалуйста, это функция для менюКаждый раз, когда сыграна какая-то из игр, я вызываю функцию чтобы вернуться с меню

314
Проблема с Intent

Проблема с Intent

Мне нужно отправить ссылку через Intent

290