LINUX.ORG.RU

libstdc++, UTF-8, thousand separator печатается как один байт вместо двух


0

2

Неприятный баг в libstdc++, багу уже лет 8 (нашел упоминание аж от 2004-го). И все дубликаты помечены WONTFIX. Суть бага в том что разделитель тысяч (так вроде) в русской локали суть неразрывный пробел и кодируется в UTF-8 двумя байтами (0xC2 0xA0), но на печать вылетает только первый. Строка становится некорректной и на неё ругаются все, кому не лень. Да и выглядит неаккуратно.

Есть способ обойти (без хаков вроде сброса LC_MONETARY в C)?

#include <iostream>
#include <sstream>
#include <locale>
using namespace std;
int main (void)
{
        locale::global (locale (""));

        int k = 1023;
        stringstream ss;
        ss << k;
        cout << ss.str() << endl;
        cout << k << endl;
}
$ ./a.out | hexdump -C
00000000  31 c2 30 32 33 0a 31 30  32 33 0a                 |1.023.1023.|
0000000b
★★★★★

насколько я знаю, в русской локали НЕТ разделителя тысяч. Потому что в россии(и многих других странах) тысячи не разделяются ни пробелами ни запятыми ни апострофами.

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

насколько я знаю, в русской локали НЕТ разделителя тысяч

У меня в системе (debian testing) есть.

$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

$ locale -k thousands_sep | hexdump -C
00000000  74 68 6f 75 73 61 6e 64  73 5f 73 65 70 3d 22 c2  |thousands_sep=".|
00000010  a0 22 0a                                            |.".|
00000013

i-rinat ★★★★★
() автор топика

багу уже лет 8 (нашел упоминание аж от 2004-го).

Можно ссылок?

А если попробовать использовать wchar_t?

Deleted
()
Ответ на: комментарий от i-rinat

Совсем не понял, что имелось в виду. Самому реализовать? Или перейти на C?

wstringstream, wcout и так далее.

Deleted
()
Ответ на: комментарий от Deleted

wstringstream, wcout и так далее.

работает. Но только если везде wchar_t используется. К сожалению, с gtkmm не стыкуется, он, похоже, на байты завязан.

i-rinat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.