Pull to refresh

Comments 27

Полезная статья, спасибо.
Жаль, чтоо порой велосипеды настолько «вьехали» в процесс, что перехадить на новые, пусть даже, возможно, более правельные уже не хочется.
Надо же, этим редактором кто-то всё же пользуется :)
Хороший и простой в использовании. Если имеете отношение к его созданию — спасибо.
Ну я только с дизайном помог :)
Лучше скажите — есть ли метод перевода string во float, который не только от локали не зависит, но и позволяет указывать символ разделителя десятичной и дробной части?
Ну или хотя бы такой, который может работать одновременно и с '.' и с ','?
За разделители целой и дробой части отвечает фасет numpunct. Переопределяете его, затем потоковому вводу выводу присваиваете локаль с фасетом numpunct (у потоков тоже есть функция imbue). После чего можно в stringstream писать этим потоком float.
Псеводокод (не обращайте внимание на ошибки — тороплюсь на работу):
  1.  
  2. class numpunct : public numpunct;
  3. ...
  4. numpunct* my = new numpunct();
  5. locale my(locale(""), my).
  6. stringstream float_sstr;
  7. float_sstr.imbue(my);
  8. float_sstr << "1.234";
  9. string str = float_str.sstr();
  10.  
А если вас устраивает точка, то и фасет переопределять не надо. Используйте из классической локали:
  1.  
  2. locale my(locale(""), use_facet <numpunct<char>>(locale("C")))
  3.  

Как-то так. Для более точного синтаксиса обратитесь к книге Страуструпа.
Разве запись str(«привет, мир») — корректна? Почему не (L«привет, мир»)?
Смотря что вы хотите получить. L«текст» создаст std::wstring(), с wstring все будет подругому. Я лишь привел пример…
Почему бы и нет, однобайтные кодировки еще никто не отменял.
А есть ли в std нынче какой-нибудь аналог кутишного QObject::tr?
Откуда ему там взяться? tr юзает Qt мета-подсистему, ничего подобного в С++ нет, и вряд ли будет. Ибо оно тут не нужно.
Подобные системы хороши не только библиотекой, подменяющей строковые константы, но и средствами вычленения этих констант из кода для последующей обработки переводчиком. STL — это лишь библиотека. Она не содержит никаких утилит, хотя средства интернационализации имеются — это фасет messages. Он позволяет создавать константы-сообщения и предоставляет удобный способ управления ими.
Для интернационализации приложений я использую gettext. То есть не всегда использую, но код пишу так, чтобы подключение gettext или Qt::tr прошло безболезненно. Включаю заголовочный gettext.hpp файл, определяющий макрос _(). поначалу так:
  1.  
  2. #define _(String) (String)
  3.  

Все сообщения обрамляю этим макросом:
  1.  
  2. std::cout << _("Hello world!") << std::endl;
  3.  

Затем, когда наступает светлый момент и приходится заниматься интернационализацией, делаю изменения в gettext.hpp и в main, прикручивая gettext или Qt в зависимости от потребностей.
[offtopic]Спасибо. Статья дала повод еще раз порадоваться переходу на .NET, с его юникодом на всех уровнях + IFormatter и CultureInfo соответственно.[/offtopic]
[offtopic]Все это не появилось в .NET из ниоткуда… Не стоит, думаю, затрагивать эту тему, а то отклонимся в никому ненужные сравнения теплого с мягким.[/offtopic]
А что мешает использовать юникод в С++?
Как правило наличие унаследованного кода, несовместимого с unicode, в том числе и в RTLях.
Некоторые подобные ситуации можно лечить с помощью фасета codecvt. Честно говоря, не хотел писать о нем — у Страуструпа все разобрано подробно, но думаю стоит… Да и читать 1 страницу на хаборе для ознакомления проще, чем погружаться в Руководство.
Извините, не по теме — а что на камне-то написано, никак не могу разобрать?(
Тьфу, блин, прошу прощения :)
По идее должно быть «Iai?aai iieaaou, eiiy iioa?yaou!», или на худой конец "═ряЁртю яющфх°№, ъюэ  яюЄхЁ х°№!".
Интересно, а конь в курсе что там написано? =)
1251? Буээ. Расскажите лучше про Unicode.
Буээ или не буээ, а 8-битные кодировки никто не отменял и нужно уметь с ними работать. Я не разграничивал в этой статье wchar и char. В примере схалявил — писал фасет не как шаблон, а как класс, но это никоим образом не отражается на логике работы фасетов (все они шаблоны, параметризующиеся как wchar-ом так и char-ом). Более того среди неопределенных мною виртуальных функций фасета ctype есть такие как narrow и widen, служащие для обучения программы «сужению» и «расширению» символов. То есть, с помощью них программа-пользователь может налету менять 8-ми битные кодировки на 16-битные и обратно…
Маленькое замечание по примеру. Я забыл подключить locale:
  1.  
  2. #include <locale>
  3.  

В данном случае ничего страшного — его подключил какой-то другой заголовочный файл, но имейте ввиду…
Sign up to leave a comment.

Articles