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