Нет ли std::to_u16string или std::to_u32string?

Я был рад, что стандартная библиотека получила функцию to_string, но теперь я в режиме WTF. Во-первых, почему это не шаблон, во-вторых, если это не шаблон для возвращаемого значения, то почему в мире у них нет функций to_u16string() и to_u32string().

Я знаю, что есть лексический состав boost, но мне любопытно узнать, есть ли стандартный способ получить то, что я хочу, без ручного написания этих функций?

РЕДАКТИРОВАТЬ: что еще хуже, boost 1.46 также не любит u16string :(

boost::lexical_cast<u16string>(22.44);

завершение вызывается после создания экземпляра 'boost::exception_detail::clone_impl

' what(): неправильный лексический состав: значение исходного типа не может быть интерпретировано как целевое


person NoSenseEtAl    schedule 01.12.2011    source источник
comment
Возможный дубликат stackoverflow.com/questions/7232710 /   -  person Jim Jeffries    schedule 01.12.2011
comment
В STL нет to_string.   -  person Lightness Races in Orbit    schedule 02.12.2011
comment
Хотя я полностью согласен с Томалаком по поводу нытья, я не уверен, что в этом вопросе неконструктивного по сравнению с другими. Было много вопросов, почему язык X делает то, что Y? вопросы. Большинство из них не закрыты. Да, этот вопрос очень сформулирован плохо. Но по сути, это просто вопрос о std::to_string и ему подобных.   -  person Nicol Bolas    schedule 02.12.2011
comment
также он спрашивает, почему boost также не может выполнить преобразование, но я думаю, что на него ответили... С++ не может этого сделать, поэтому я думаю, что boost не может сделать это легко...   -  person NoSenseEtAl    schedule 02.12.2011
comment
также что, если cpp получит поддержку Unicode. тогда я предполагаю, что авторы шаблонов будут очень злы из-за отсутствия std::tostring‹*string_type*› Я думаю, они всегда могут добавить to_basic_string‹*string_type*› хотя... это просто выглядит ужасным дизайнерским решением для меня...   -  person NoSenseEtAl    schedule 03.12.2011
comment
Помимо разглагольствований, это совершенно правильный вопрос, голосование за повторное открытие.   -  person vitaut    schedule 09.04.2018
comment
Вы можете легко решить эту проблему с помощью двух строк кода: wstring_convert<codecvt_utf8_utf16<char32_t>, char32_t> utf32conv; auto to_u32string = [&] (const auto& value) -> u32string {return utf32conv.from_bytes(to_string(value));};   -  person xamid    schedule 23.09.2019


Ответы (1)


Расслабьтесь и сделайте глубокий вдох, прежде чем упадете в обморок.

Все это имеет смысл. to_string и to_wstring используют sprintf/wsprintf. В языке нет ничего, что пересекало бы мост между независимой узкой/широкой кодировкой и кодировками UTF, поэтому просто не существует стандартного библиотечного средства для производства строк в кодировке UTF. Новые возможности UTF позволяют сохранять строки в кодировке UTF и перекодировать их между собой, но невозможно преобразовать системную кодировку в кодировку UTF без помощи дополнительной библиотеки.

Как будут выглядеть те «20 строк кода», которые вы предлагаете? Включите числа с плавающей запятой, пожалуйста.

(Вот мои стандартные ссылки на вопросы по этому вопросу: #1, #2, #3)

person Kerrek SB    schedule 01.12.2011
comment
Итак, вы говорите мне, что нет способа преобразовать числа (с плавающей запятой или int) в стандартном cpp в строки Unicode? - person NoSenseEtAl; 01.12.2011
comment
@NoSenseEtAl: правильно. Вам понадобится внешняя библиотека, например iconv(). С другой стороны, вы тот, кто хвастался, что вы могли сделать это в 20 строк, так что мне все еще любопытно, как вы предлагаете это сделать. - person Kerrek SB; 01.12.2011
comment
хорошо, как насчет простого to_wstring, а затем приведения этого к u16string... Я имею в виду, что я действительно не понимаю, почему преобразование NUMBER в строку unicode невозможно без внешней библиотеки. - person NoSenseEtAl; 01.12.2011
comment
Прочтите мои связанные посты. Широкие строки не имеют ничего общего с Unicode. Их просто нет. И снова, если вы думаете, что можете это сделать, пожалуйста, сделайте и опубликуйте! (Я допускаю, что это должно быть легко для целых чисел.) - person Kerrek SB; 01.12.2011
comment
так ты это говоришь. , и - жесткие части ? - person NoSenseEtAl; 01.12.2011
comment
@Kerrek SB Не все так просто, если кто-то хочет преобразовать цифры Unicode, отличные от ASCII (скажем, U+0660 – U+0669) и целые числа... возможно, я хочу слишком многого, но Java может преобразовать эти символы в правильные цифры по отдельности. - person Cubbi; 02.12.2011
comment
@NoSense - стандарт не говорит, как кодируется wstring. С таким же успехом это может быть эквивалентно u32string. Или что-то другое. - person Bo Persson; 02.12.2011
comment
@Cubbi: Вы совершенно правы, это нетривиально даже для целых чисел - хотя это не очень сложно для целых чисел, если вы разрешите to_string() в качестве промежуточного шага. - person Kerrek SB; 02.12.2011
comment
Ладно, я совсем запутался... что запрещает использовать u'-', u'.', u'0', u'1', u'2'... u'9' для выполнения to_u16string - person NoSenseEtAl; 02.12.2011
comment
@NoSenseEtAl: да, это должно быть просто для целых чисел. На мгновение я подумал, что sprintf поддерживает локаль, но это не режим по умолчанию (%i и %d). Чтобы получить числа с плавающей запятой, вам, по сути, придется скопировать код sprintf и внести все необходимые корректировки. uNNsprintf был бы наиболее очевидным первым шагом, так что это следует в первую очередь запросить у библиотеки C. - person Kerrek SB; 02.12.2011