Подробности
[В начало]
Проблема в реализации № S0744
Краткое описание
locale::name путает имена локалей для категорий LC_TIME и LC_COLLATE
Подробное описание
Если именнованная (locale::name() возвращает не "*") локаль неоднородна, т.е состоит из категорий из разных локалей, то locale::name возвращает строку типа "CAT1=name1;CAT2=name2;...;CATN=nameN", где CAT1...CATN - категории(LC_CTYPE, LC_NUMERIC...), а name1...nameN - имена локалей, откуда взяты категории.
При этом имена локалей для LC_TIME и LC_COLLATE оказываются перепутанными: для LC_TIME стоит то, что должно стоять для LC_COLLATE, а для LC_COLLATE - то, что должно стоять для LC_TIME.
Если создать новую локаль по имени исходной локали, то семантики категорий LC_TIME и LC_COLLATE новой локали будут отличатся от исходной.
В приведенном ниже примере в имени локали ищется строка "LC_COLLATE=C", которая означает, что LC_COLLATE берется из "C"-локали. Однако в соответствии со способом создания, эта категория должна браться из другой локали (и берется в реальности).
Раздел стандарта
Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx, который ссылается на ISO/IEC 14882: 2003 Programming languages --C++, section 22.1.1.3
Пример
#include <locale> #include <iostream> using namespace std; int main() { //instead "en_US" any locale name may be used, except "C" and "POSIX" locale loc(locale("C"), "en_US", locale::collate); cout << "Name of locale is " << loc.name() << endl; if(loc.name().find("LC_COLLATE=C") != string::npos) cout << "Collate facet is taken from \"C\" locale\n"; return 0; }
Компонент
libstdc++
Ссылки
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29217
Статус
Исправлено в gcc-4.2
[В начало]