Remix.run Logo
Improvements to Std:Format in C++26(mariusbancila.ro)
22 points by jandeboevrie 2 days ago | 7 comments
Longhanks 2 hours ago | parent | next [-]

> A related issue solved along was Windows string representation of paths. std::filesystem::path stores its text in wchar_t encoded as UTF-16 (Windows native). But p.string() narrows it down to the active code page, rather than UTF-8 which is what the formatting library expects. The result was a non-ASCII path could get transcoded to gibberish. The C++26 std::formatter<std::filesystem::path> converts Windows native UTC-16 to UTF-8 using Unicode transcoding and avoiding code pages, therefore solving the problem.

...only to then convert it back to UTF-16 for WriteConsoleW(), which std::print() usually calls (unless not running in a console) (https://github.com/microsoft/STL/blob/488e7953685722d2d6666f...).

veltas 2 hours ago | parent | prev [-]

Surely std::print() shouldn't print anything?

CamouflagedKiwi 2 hours ago | parent | next [-]

It's a typo, he describes it as std::println in the text, but the code snippet is just print()

steeleduncan 2 hours ago | parent | prev | next [-]

I think it is a typo, and should be std::println()

nikbackm 2 hours ago | parent | prev [-]

Why even call it in that case?

xuhu 2 hours ago | parent | next [-]

It's apparently a typo in the article, they probably meant to write `println()`.

IshKebab 36 minutes ago | parent | prev [-]

Typo in this case, but in general supporting "useless" code like this is sometimes a good idea because it makes writing generic code easier. Maybe not in this case.