Язык и кодировка описаний эксепшенов C++ boost (std::exception::what() возвращает сроку в 8-битной кодировке)

Модератор: Модераторы разделов

FlySnake
Сообщения: 992
ОС: openSUSE

Язык и кодировка описаний эксепшенов C++ boost

Сообщение FlySnake »

Всем привет!
Есть примерно такая конструкция

Код: Выделить всё

        try
        {
            boost::asio::write(*sock, boost::asio::buffer(buf, buf_length));
        }
        catch(std::exception& e)
        {
            std::cout << e.what() << std::endl;
        }

boost::asio::write() бросает эксепшен, std::exception::what() возвращает его текстовое описание. Беда в том что сейчас пишу этот код под винду (потом под линух будет) с локалью CP1251 и текст описания эксепшена выводиться по-русски в CP1251 что есть нежелательно, надо английский.
setlocale(LC_ALL, NULL) == "C"
Вообще текст эксепшенов независит от установленной локали с помощью setlocale().
В C++ я ещё нуб, в boost-е ещё больший. В документации и гугле не нашёл ответа. Подскажите плз.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение sash-kan »

FlySnake писал(а):
07.08.2012 15:52
текст описания эксепшена выводиться по-русски в CP1251 что есть нежелательно, надо английский
в английском нет локали *cp1251

на серьёзной волне:
этот текст вписан внутри вашей программы?
если да, замените его на английский·
если нет, не ломайте голову, пусть gettext+glibc занимаются тем, чем должны·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение FlySnake »

sash-kan писал(а):
07.08.2012 16:10
в английском нет локали *cp1251

Так и не надо. Это boost видимо видя русскую локаль выводит сообщения в 1251. Насколько я понимаю нужно задать глобально английскую локаль и кодировку для программы либо только для boost::asio, в котором происходят эти эксепшены

sash-kan писал(а):
07.08.2012 16:10
этот текст вписан внутри вашей программы?

Этот текст насколько я понимаю в boost-е вписан
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение bormant »

[никогда не надо всецело полагаться на результат]
А если взять проблемный участок кода с необходимыми #include и uses namespace, записать на *nix в test.cpp и выполнить, то текст проблемного исключения в чём получите, 1) всегда в кодировке консоли или 2) иногда ещё в какой-то?
[/никогда не надо всецело полагаться на результат]
Тут дело такое... Локаль у потока в Windows -- одна беда, а в *nix -- другая. Если boost пытается их унифицировать, а текст исключения не ваш, то, скорее всего, всё в порядке. А если ваш, то gettext в помощь.
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение FlySnake »

Попробовал в линухе. Буст той же версии 1.50. Тут всё ОК. Сообщения выводятся в локали и кодировке, заданной с помощью setlocale(). Сделал setlocale(LC_ALL, "ru_RU.UTF-8") и получил русские букофки на консоле в UTF-8, en_US.UTF-8 и сообщения на английском. Т.е. в нормальной ОС работает как ожидалось, а в винде - нет, причём имена локалей верные задаю, они там по-другому называются типа Russia_Russian.1251 а если задать не верные до на stderr вывалиться ругань, но никакой реакции на setlocale() нет. Ладно, это уже оффтопик :)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение NickLion »

А можно пример текста исключения? Может это ответ strerror? Какой компилятор используется?
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение FlySnake »

Тестовый код:

Код: Выделить всё

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <locale.h>

int main(int argc, char *argv[])
{
        setlocale(LC_ALL, "ru_RU.UTF-8");
        printf("Locale %s\n", setlocale(LC_ALL,NULL));
        try
        {
                boost::asio::io_service io;
                boost::asio::ip::tcp::socket sock(io);
                boost::asio::ip::address_v4 serv_ip;
                serv_ip = boost::asio::ip::address_v4::from_string(std::string("0.0.0.0"));
                boost::asio::ip::tcp::endpoint serv_ep;
                serv_ep.address(serv_ip);
                serv_ep.port(1234u);
                sock.connect(serv_ep);
        }
        catch(std::exception& e)
        {
                std::cout << e.what() << std::endl;
        }
        return 0;
}

В линухе выдаёт
QUOTE писал(а):Locale ru_RU.UTF-8
connect: В соединении отказано

В английском варианте
QUOTE писал(а):connect:Connection refused


Компилятор в линухе gcc 4.4.1, в винде mingw-gcc 4.6.1
Спасибо сказали:
Аватара пользователя
TuxWare
Сообщения: 637
ОС: Windows 7

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение TuxWare »

Я поставил пакет glibc - все сообщения oб ошибках идут на английском. Добавил glibc-locale - теперь сообщения пойдут в соответствии с setlocale. Если вы в виндовсе не ставили пакет-locale, то чего вы там ищите?
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Язык и кодировка описаний эксепшенов C++ boost

Сообщение FlySnake »

TuxWare писал(а):
08.08.2012 12:40
Я поставил пакет glibc - все сообщения oб ошибках идут на английском. Добавил glibc-locale - теперь сообщения пойдут в соответствии с setlocale. Если вы в виндовсе не ставили пакет-locale, то чего вы там ищите?

Вот как раз ищу английский язык на русском виндовсе ибо сейчас он выводит всё на русском в cp1251.

-=update=-
Похоже там strerror. Сделал вызов I/O с параметром boost::system::error_code, вернулась ошибка вместо исключения, а именно знакомая "Операция успешно завершена". На setlocale(LC_ALL, "English") замечена реакция strftime(), т.е. локали всё же меняются, но буст на них не реагирует.
Спасибо сказали: