В C ++ я хочу использовать Unicode для чего-то. Так что после того, как я провалился в кроличью нору Unicode, я оказался в вагон-катастрофе из-за неразберихи, головных болей и локаций.
Но в Boost у меня возникла досадная проблема: я пытался использовать пути к файлам Unicode и пытался использовать библиотеку опций программы Boost с вводом Unicode. Я читал все, что мог найти по предметам locales, codecvts, Unicode encodings и Boost.
Моя текущая попытка заставить все работать - это использовать codecvt, который принимает строку UTF-8 и преобразует ее в кодировку платформы (UTF-8 в POSIX, UTF-16 в Windows). Я пытался избегайте wchar_t
.
Самое близкое, что я получил, - это попытка сделать это с помощью Boost.Locale, чтобы преобразовать строку UTF-8 в строку UTF-32 на выходе.
#include <string>
#include <boost/locale.hpp>
#include <locale>
int main(void)
{
std::string data("Testing, 㤹");
std::locale fromLoc = boost::locale::generator().generate("en_US.UTF-8");
std::locale toLoc = boost::locale::generator().generate("en_US.UTF-32");
typedef std::codecvt<wchar_t, char, mbstate_t> cvtType;
cvtType const* toCvt = &std::use_facet<cvtType>(toLoc);
std::locale convLoc = std::locale(fromLoc, toCvt);
std::cout.imbue(convLoc);
std::cout << data << std::endl;
// Output is unconverted -- what?
return 0;
}
Я думаю, что у меня был какой-то другой вид преобразования, работающий с использованием широких символов, но я действительно не знаю, что я вообще делаю. Я не знаю, какой инструмент лучше всего подходит для работы на данный момент. Помощь?