преобразование символа в формат \ uxxx в C / C ++ - PullRequest
0 голосов
/ 07 марта 2012

Я хочу преобразовать строку / символ в формат \ uxxx в программе C / C ++. Поддержка У меня есть символ 'A', я хочу напечатать конвертировать как \ u0041 (стандартный Unicode).

Во-вторых, я использовал утилиту командной строки unix для печати (printf) для вывода строки \ uxxx в тип char. Я попытался с "\ u092b" распечатать другой символ, чем мой файл шрифта. Может ли кто-нибудь объяснить, пожалуйста, причину этого.

1 Ответ

0 голосов
/ 08 марта 2012

Вот функция, использующая стандартный C ++ для этого (хотя в зависимости от CharT могут быть некоторые требования, которым не соответствует определенное поведение, определенное реализацией).

#include <codecvt>
#include <sstream>
#include <iomanip>
#include <iostream>

template<typename CharT,typename traits,typename allocator>
std::basic_string<CharT,traits,allocator>
to_uescapes(std::basic_string<CharT,traits,allocator> const &input)
{
    // string converter from CharT to char. If CharT = char then no conversion is done.
    // if CharT is char32_t or char16_t then the conversion is UTF-32/16 -> UTF-8. Not all implementations support this yet.
    // if CharT is something else then this uses implementation defined encodings and will only work for us if the implementation uses UTF-8 as the narrow char encoding
    std::wstring_convert<std::codecvt<CharT,char,std::mbstate_t>,CharT> convertA;

    // string converter from UTF-8 -> UTF-32. Not all implementations support this yet
    std::wstring_convert<std::codecvt<char32_t,char,std::mbstate_t>,char32_t> convertB;

    // convert from input encoding to UTF-32 (Assuming convertA produces UTF-8 string)
    std::u32string u32input = convertB.from_bytes(convertA.to_bytes(input));

    std::basic_stringstream<CharT,traits,allocator> ss;
    ss.fill('0');
    ss << std::hex;
    for(char32_t c : u32input) {
        if(c < U'\U00010000')
            ss << convertA.from_bytes("\\u") << std::setw(4) << (unsigned int)c;
        else
            ss << convertA.from_bytes("\\U") << std::setw(8) << (unsigned int)c;
    }
    return ss.str();
}

template<typename CharT>
std::basic_string<CharT>
to_uescapes(CharT const *input)
{
    return to_uescapes(std::basic_string<CharT>(input));
}

int main() {
    std::string s = to_uescapes(u8"Hello \U00010000");
    std::cout << s << '\n';
}

Это должно вывести:

u0065 \ u006c \ u006f \ u0020 \ U00010000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...