Есть ли обновления поддержки локализации в C ++ 0x? - PullRequest
11 голосов
/ 08 октября 2009

Чем больше я работаю с фасетами языка 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 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: Согласно последним заметкам о C ++ 0x, я вижу, что std::time_get::get - аналогично strptime и противоположно std::time_put::put.

Ответы [ 2 ]

4 голосов
/ 10 ноября 2009

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

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

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

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

Я очень пессимистичен по этому поводу.

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

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

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

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

1 голос
/ 08 октября 2009

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

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

...