Есть ли обновления поддержки локализации в С++ 0x?

Чем больше я работаю с языками языка С++, тем больше я понимаю --- они сломаны.

  • 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.

Ответ 1

Я согласен с вами, С++ не имеет надлежащей поддержки i18n.

Кто-нибудь знает, ожидаются ли какие-либо изменения в стандартных гранях в С++ 0x?

В игре слишком поздно, поэтому, вероятно, нет.

Есть ли способ принести важность таких изменений?

Я очень пессимистично отношусь к этому.

Когда его спросили напрямую, Страуструп утверждал, что он не видит никаких проблем с текущим статусом. И еще один из больших ребята С++ (автор книги и все) даже не понял, что wchar_t может быть одним байтом, если вы читаете стандарт.

И некоторые потоки в boost (что, кажется, направляет направление в будущем) показывают малое понимание того, как это работает, что страшно страшно.

С++ 0x едва ли добавил некоторые типы символов символов Юникода, в конце игры и после большой борьбы. Я слишком долго не задерживаю дыхание.

Я предполагаю, что единственный шанс увидеть что-то лучше, если кто-то действительно хороший/уважаемый в мирах i18n и С++ напрямую связан со следующей версией стандарта. Не знаю, кто это может быть: - (

Ответ 2

std::numpunct является шаблоном. Все специализации пытаются вернуть символ десятичного разделителя. Очевидно, что в любой локали, где это широкий символ, вы должны использовать std::numpunct<wchar_t>, поскольку специализация <char не может этого сделать.

Тем не менее, С++ 0x в значительной степени выполняется. Однако, если хорошие улучшения продолжатся, комитет С++, вероятно, начнет С++ 1x. Комитет по стандарту ISO С++, скорее всего, примет вашу помощь, если ее предложит ваша национальная организация-член ISO. Я вижу, что Павел Минаев предложил отчет о дефектах. Это технически возможно, но проблемы, которые вы описываете, - это общие ограничения дизайна. В этом случае наиболее надежным направлением является создание библиотеки Boost для этого, пройти ли она проверку Boost, представить ее для включения в стандарт и принять участие в совещаниях ISO С++ для решения любых возникающих там проблем.