Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
1

Как задать локаль для потока?

06.05.2013, 08:29. Просмотров 3016. Ответов 31
Метки нет (Все метки)

Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет. Если поставить
C++
1
Fille.imbue("ru_RU.UTF8");
, или
C++
1
std::locale::global(std::locale("ru_RU.UTF8"));
, прога аварийно завершается.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2013, 08:29
Ответы с готовыми решениями:

Можно ли задать десятичный разделитель для потока?
Можно ли задать десятичный разделитель для std::ofstream?

Можно ли задать ограничения для итератора потока ввода?
Изучая c++, наткнулся на такой способ заполнения вектора из потока. istream_iterator< int >...

Как сменить локаль? Хотя бы для вывода времени
#include <QtCore> int main(int argc, char *argv) { QCoreApplication a(argc, argv); ...

Как в Qt задать локаль типа "rus-rus" ?
Ну наверное системную локаль... Чтоб это было кроссово.... :) Добавлено через 39 минут Меня...

31
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 08:46 2
taras atavin,
C++
1
File.imbue(std::locale("ru_RU.UTF8"));
Но тут возникает вопрос - есть-ли данная локаль в системе? Можно использовать буст или что-то вроде, где гарантированно реализован фасет для utf8.
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 08:54  [ТС] 3
Цитата Сообщение от ForEveR Посмотреть сообщение
File.imbue(std::locale("ru_RU.UTF8"));
Читай

Цитата Сообщение от taras atavin Посмотреть сообщение
Если поставить
C++
1
Fille.imbue("ru_RU.UTF8");
C++
1
std::locale::global(std::locale("ru_RU.UTF8"));
, прога аварийно завершается.
Добавлено через 26 секунд
Цитата Сообщение от ForEveR Посмотреть сообщение
Можно использовать буст или что-то вроде, где гарантированно реализован фасет для utf8.
Как?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 09:32 4
taras atavin, Нету винды, а gcc и mingw (работающем через wine) вполне себе окей считывают в std::string, но не считывают в std::wstring, если кодировка файла utf8. Задача считать именно в wstring и кодировка файла точно utf8?
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 09:48  [ТС] 5
Цитата Сообщение от ForEveR Посмотреть сообщение
. Задача считать именно в wstring и кодировка файла точно utf8?
Да, но не обязательно на прямую. А если читать в std::string, то при этом файл перекодируется в ansi? Или останется в utf-8? И как потом привести одну строку к другой?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 10:13 6
taras atavin, Файл никуда не перекодируется. В std::string нормально считывается и выводится или есть некие проблемы?
0
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:15 7
Лучший ответ Сообщение было отмечено как решение

Решение

Юникод читается и обрабатывается с помощью вот этого. wstring — ересь и полумеры.
3
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 10:27  [ТС] 8
Цитата Сообщение от ForEveR Посмотреть сообщение
Файл никуда не перекодируется.
Это и так понятно, вопрос был задан проstd::string, прочитанной с такого файла. Читается ли туда сам файл, или результат его перекодирования в ansi в озу? Мне надо, чтоб строка была в utf8. И при этом не зависеть от локализации винды.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
и выводится или есть некие проблемы?
Я вывожу с помощью TextOutW, приводя с помощью c_str().

Добавлено через 45 секунд
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Юникод читается и обрабатывается с помощью вот этого.
Что это?
0
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:46 9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это?
Это кроссплатформенная библиотека для работы с Юникодом. Она очень полезна, чтобы вот эти вопросы не возникали
Читается ли туда сам файл, или результат его перекодирования в ansi в озу?
И при этом не зависеть от локализации винды.
А если читать в std::string, то при этом файл перекодируется в ansi?
И как потом привести одну строку к другой?
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих подходящих строк, но не более того.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 10:58 10
OhMyGodSoLong, То не совсем так. В С++11 появились новые codecvt-шки и конвертеры wstring_converter, wbuffer_converter.
http://en.cppreference.com/w/cpp/locale
1
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 11:23  [ТС] 11
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих строк, но не более того.
Проект с define UNICODE и я в конце концов нашёл, как в смой среде перекодировать исходник в utf8. И какая вообще возможна локалезависимость многобайтной кодировки? Внутренее представление толи в utf16, толи в utf32, то ли в прямом порядке байт, то ли в обратном. Какое мне вообще дело до версий уникода во внутреннем представлении? Но кириллица в арабский превращаться не будет, а если юзать utf to ansi, то на иноязычной винде буквы могут стать другими.
0
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 12:13 12
В том, что wchar_t не обязательно два байта. Или четыре. Может быть вообще один и какие-то хитрые танцы с бубном с кодировками, как с чаром. Это не переносимый Юникод. Это платформозависимый возможно-шире-чем-однобайтный тип символов.

Правда, в Винде принят UTF-16, так что там скорее всего wchar_t = UTF-16. Варианты вам показали: или codecvt_utf8_utf16, или ICU/Boost/любая-другая-сторонняя-библиотека.
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 13:20  [ТС] 13
Куда этот буст копирожать?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 13:39 14
taras atavin, В доке ведь все написано... Инсталлируете через b2 библиотеки. Указываете куда инсталлировать (prefix). Инсталлируете. Прописываете в путях IDE диру к либам и диру к хедерам. Наверняка где-нибудь есть уже собранный буст для винды.
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 14:10  [ТС] 15
Цитата Сообщение от ForEveR Посмотреть сообщение
Указываете куда инсталлировать (prefix)
А куда?

Добавлено через 44 секунды
Цитата Сообщение от ForEveR Посмотреть сообщение
Наверняка где-нибудь есть уже собранный буст для винды.
который кодоблоками не подцепится.

Добавлено через 1 минуту
вот смотри, пишу я
C++
1
#include <boost/numeric/ublas/vector.hpp>
, буст бросил в один каталог, кодоблоки ищут головы в другом. Не найдут, факт.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 14:12 16
taras atavin, Гугл. Реально гугл в помощь. Буст ничем не отличается от любых других сторонних библиотек в плане подключения к IDE.
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 16:40  [ТС] 17
Где мне вообще искать в моей IDE, где она ищет головы? Без относительно буста.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 16:41 18
taras atavin, Ну, это вам лучше знать. В настройках. http://wiki.codeblocks.org/ind... _variables
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
06.05.2013, 17:32  [ТС] 19
А у меня здесь пусто.

Добавлено через 47 минут
Всё, буст воткнул. А как его юзать для загрузки уникода?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
06.05.2013, 18:06 20
taras atavin, Читать документацию по boost::locale.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2013, 18:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

как задать имя потока из строки?
есть поток ifstream - входные файлы, задаю его так: ifstream infile(s1); s1 задается же так: int...

Мьютексы-потоки: Как задать время выполнения потока
Подскажите пожалуйста насчет следующих вопросов, сам не разобрался. 1. Как задать время...

Почему длинна потока это целое типа LONG, а смещение (offset) можно задать как INT
Доброго времени суток уважаемые! Объясните мне пожалуйста, почему длинна потока это целое типа...

Установить локаль для приложения
Можно ли установить локаль приложения, независимо от установленной на компе пользователя? С тем,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.