Подробности

[В начало]

Проблема в реализации № 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

[В начало]