Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 08:29     Как задать локаль для потока? #1
Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет. Если поставить
C++
1
Fille.imbue("ru_RU.UTF8");
, или
C++
1
std::locale::global(std::locale("ru_RU.UTF8"));
, прога аварийно завершается.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 08:46     Как задать локаль для потока? #2
taras atavin,
C++
1
File.imbue(std::locale("ru_RU.UTF8"));
Но тут возникает вопрос - есть-ли данная локаль в системе? Можно использовать буст или что-то вроде, где гарантированно реализован фасет для utf8.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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.
Как?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 09:32     Как задать локаль для потока? #4
taras atavin, Нету винды, а gcc и mingw (работающем через wine) вполне себе окей считывают в std::string, но не считывают в std::wstring, если кодировка файла utf8. Задача считать именно в wstring и кодировка файла точно utf8?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 09:48  [ТС]     Как задать локаль для потока? #5
Цитата Сообщение от ForEveR Посмотреть сообщение
. Задача считать именно в wstring и кодировка файла точно utf8?
Да, но не обязательно на прямую. А если читать в std::string, то при этом файл перекодируется в ansi? Или останется в utf-8? И как потом привести одну строку к другой?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 10:13     Как задать локаль для потока? #6
taras atavin, Файл никуда не перекодируется. В std::string нормально считывается и выводится или есть некие проблемы?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:15     Как задать локаль для потока? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Юникод читается и обрабатывается с помощью вот этого. wstring — ересь и полумеры.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 10:27  [ТС]     Как задать локаль для потока? #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Файл никуда не перекодируется.
Это и так понятно, вопрос был задан проstd::string, прочитанной с такого файла. Читается ли туда сам файл, или результат его перекодирования в ansi в озу? Мне надо, чтоб строка была в utf8. И при этом не зависеть от локализации винды.

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

Добавлено через 45 секунд
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Юникод читается и обрабатывается с помощью вот этого.
Что это?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:46     Как задать локаль для потока? #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это?
Это кроссплатформенная библиотека для работы с Юникодом. Она очень полезна, чтобы вот эти вопросы не возникали
Читается ли туда сам файл, или результат его перекодирования в ansi в озу?
И при этом не зависеть от локализации винды.
А если читать в std::string, то при этом файл перекодируется в ansi?
И как потом привести одну строку к другой?
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих подходящих строк, но не более того.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 10:58     Как задать локаль для потока? #10
OhMyGodSoLong, То не совсем так. В С++11 появились новые codecvt-шки и конвертеры wstring_converter, wbuffer_converter.
http://en.cppreference.com/w/cpp/locale
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 11:23  [ТС]     Как задать локаль для потока? #11
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих строк, но не более того.
Проект с define UNICODE и я в конце концов нашёл, как в смой среде перекодировать исходник в utf8. И какая вообще возможна локалезависимость многобайтной кодировки? Внутренее представление толи в utf16, толи в utf32, то ли в прямом порядке байт, то ли в обратном. Какое мне вообще дело до версий уникода во внутреннем представлении? Но кириллица в арабский превращаться не будет, а если юзать utf to ansi, то на иноязычной винде буквы могут стать другими.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 12:13     Как задать локаль для потока? #12
В том, что wchar_t не обязательно два байта. Или четыре. Может быть вообще один и какие-то хитрые танцы с бубном с кодировками, как с чаром. Это не переносимый Юникод. Это платформозависимый возможно-шире-чем-однобайтный тип символов.

Правда, в Винде принят UTF-16, так что там скорее всего wchar_t = UTF-16. Варианты вам показали: или codecvt_utf8_utf16, или ICU/Boost/любая-другая-сторонняя-библиотека.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 13:20  [ТС]     Как задать локаль для потока? #13
Куда этот буст копирожать?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 13:39     Как задать локаль для потока? #14
taras atavin, В доке ведь все написано... Инсталлируете через b2 библиотеки. Указываете куда инсталлировать (prefix). Инсталлируете. Прописываете в путях IDE диру к либам и диру к хедерам. Наверняка где-нибудь есть уже собранный буст для винды.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 14:10  [ТС]     Как задать локаль для потока? #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Указываете куда инсталлировать (prefix)
А куда?

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

Добавлено через 1 минуту
вот смотри, пишу я
C++
1
#include <boost/numeric/ublas/vector.hpp>
, буст бросил в один каталог, кодоблоки ищут головы в другом. Не найдут, факт.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 14:12     Как задать локаль для потока? #16
taras atavin, Гугл. Реально гугл в помощь. Буст ничем не отличается от любых других сторонних библиотек в плане подключения к IDE.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 16:40  [ТС]     Как задать локаль для потока? #17
Где мне вообще искать в моей IDE, где она ищет головы? Без относительно буста.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 16:41     Как задать локаль для потока? #18
taras atavin, Ну, это вам лучше знать. В настройках. http://wiki.codeblocks.org/index.php...iler_variables
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 17:32  [ТС]     Как задать локаль для потока? #19
А у меня здесь пусто.

Добавлено через 47 минут
Всё, буст воткнул. А как его юзать для загрузки уникода?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 18:06     Как задать локаль для потока?
Еще ссылки по теме:

Можно ли задать десятичный разделитель для потока? C++
Как задать кодировку для заголовка окна? C++
C++ Как задать два условия для цикла

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.05.2013, 18:06     Как задать локаль для потока? #20
taras atavin, Читать документацию по boost::locale.
Yandex
Объявления
06.05.2013, 18:06     Как задать локаль для потока?
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru