mirror of
https://github.com/fmtlib/fmt.git
synced 2025-11-27 04:39:44 +01:00
Improve handling of Unicode in paths
This commit is contained in:
@@ -56,12 +56,23 @@ void write_escaped_path(basic_memory_buffer<Char>& quoted,
|
||||
}
|
||||
# ifdef _WIN32
|
||||
template <>
|
||||
inline void write_escaped_path<char>(basic_memory_buffer<char>& quoted,
|
||||
inline void write_escaped_path<char>(memory_buffer& quoted,
|
||||
const std::filesystem::path& p) {
|
||||
auto s = p.u8string();
|
||||
write_escaped_string<char>(
|
||||
std::back_inserter(quoted),
|
||||
string_view(reinterpret_cast<const char*>(s.c_str()), s.size()));
|
||||
auto buf = basic_memory_buffer<wchar_t>();
|
||||
write_escaped_string<wchar_t>(std::back_inserter(buf), p.native());
|
||||
for (unsigned c : buf) {
|
||||
// Convert UTF-16 to UTF-8.
|
||||
if (c < 0x80) {
|
||||
quoted.push_back(static_cast<unsigned char>(c));
|
||||
} else if (c < 0x800) {
|
||||
quoted.push_back(0b1100'0000 | ((c >> 6) & 0b01'1111));
|
||||
quoted.push_back(0b1000'0000 | (c & 0b11'1111));
|
||||
} else {
|
||||
quoted.push_back(0b1110'0000 | ((c >> 12) & 0b01'1111));
|
||||
quoted.push_back(0b1000'0000 | ((c >> 6) & 0b11'1111));
|
||||
quoted.push_back(0b1000'0000 | (c & 0b11'1111));
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
template <>
|
||||
@@ -86,7 +97,7 @@ struct formatter<std::filesystem::path, Char>
|
||||
template <typename FormatContext>
|
||||
auto format(const std::filesystem::path& p, FormatContext& ctx) const ->
|
||||
typename FormatContext::iterator {
|
||||
basic_memory_buffer<Char> quoted;
|
||||
auto quoted = basic_memory_buffer<Char>();
|
||||
detail::write_escaped_path(quoted, p);
|
||||
return formatter<basic_string_view<Char>>::format(
|
||||
basic_string_view<Char>(quoted.data(), quoted.size()), ctx);
|
||||
|
||||
Reference in New Issue
Block a user