Чем больше я работаю с языками языка С++, тем больше я понимаю --- они сломаны.
-
std::time_get
- не является симметричным сstd::time_put
(как в C strftime/strptime) и не позволяет легко разбирать времена с метками AM/PM. - я недавно обнаружил, что форматирование простого числа может приводить к незаконному UTF-8 в определенных локалях (например,
ru_RU.UTF-8
). -
std::ctype
очень упрощен, предполагая, что верхняя/нижняя может быть выполнена на основе каждого символа (преобразование случая может изменить количество символов и зависит от контекста). -
std::collate
- не поддерживает силу сопоставления (чувствителен к регистру или нечувствителен). - Невозможно указать часовой пояс, отличный от глобального часового пояса, при форматировании времени.
И многое другое...
- Кто-нибудь знает, ожидаются ли какие-либо изменения в стандартных гранях в С++ 0x?
- Есть ли способ принести важность таких изменений?
Спасибо.
EDIT: Разъяснения в случае недоступности ссылки:
std::numpunct
определяет разделитель тысяч как char. Поэтому, когда разделитель в U + 2002 - различный вид пространства, он не может быть воспроизведен как одиночный char в UTF-8, а в виде последовательности с несколькими байтами.
В C API struct lconv
определяет разделитель тысяч как строку и не страдает от этой проблемы. Таким образом, при попытке форматирования чисел с разделителями вне ASCII с локали UTF-8 создается недопустимый UTF-8.
Чтобы воспроизвести эту ошибку, напишите 1234 на std: ostream с вложенным ru_RU.UTF-8
locale
EDIT2: Я должен признать, что API-интерфейс локализации POSIX C работает намного плавнее:
- Существует инверсия strftime - strptime (strftime делает то же самое, что и
std::time_put::put
) - Нет проблем с форматированием чисел из-за упомянутой выше точки.
Однако он по-прежнему не может быть совершенным.
EDIT3: В соответствии с последними заметками о С++ 0x я вижу, что std::time_get::get
- похожее на strptime
и противоположное std::time_put::put
.