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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

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

Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет. Если поставить
C++
1
Fille.imbue("ru_RU.UTF8");
, или
C++
1
std::locale::global(std::locale("ru_RU.UTF8"));
, прога аварийно завершается.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2013, 08:29     Как задать локаль для потока?
Посмотрите здесь:

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

Как задать свои иконки для панели задач и для программы в папке? - C++
Хочу, чтобы эти иконки отличались от той, что стоит в заголовке окна приложения.

Как закончить ввод в итератор ввода для потока - C++
По задумке в представленном ниже коде вводятся слова в консоль, потом как то ввод прекращается и программа дальше выполняет свои подсчеты и...

Как задать условие для функции - C++
Добрый вечер! Например есть double Psi(double x) Нужно чтобы функция возвращала x при 0\leq x \leq 1\ , 2-x при 1\leq x \leq 2\ и 0 в...

Как задать кодировку для TextOut? - C++
Как задать кодировку для TextOut?

Как задать два условия для цикла - C++
т.е. мне нужно чтобы программа отобрала слова которые имеют 3 буквы и 2 гласных к примеру

Как задать кодировку для заголовка окна? - C++
#include<iostream> #include<windows.h> using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 08:46     Как задать локаль для потока? #2
taras atavin,
C++
1
File.imbue(std::locale("ru_RU.UTF8"));
Но тут возникает вопрос - есть-ли данная локаль в системе? Можно использовать буст или что-то вроде, где гарантированно реализован фасет для utf8.
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 09:32     Как задать локаль для потока? #4
taras atavin, Нету винды, а gcc и mingw (работающем через wine) вполне себе окей считывают в std::string, но не считывают в std::wstring, если кодировка файла utf8. Задача считать именно в wstring и кодировка файла точно utf8?
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 10:13     Как задать локаль для потока? #6
taras atavin, Файл никуда не перекодируется. В std::string нормально считывается и выводится или есть некие проблемы?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:15     Как задать локаль для потока? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Юникод читается и обрабатывается с помощью вот этого. wstring — ересь и полумеры.
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
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:46     Как задать локаль для потока? #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это?
Это кроссплатформенная библиотека для работы с Юникодом. Она очень полезна, чтобы вот эти вопросы не возникали
Читается ли туда сам файл, или результат его перекодирования в ansi в озу?
И при этом не зависеть от локализации винды.
А если читать в std::string, то при этом файл перекодируется в ansi?
И как потом привести одну строку к другой?
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих подходящих строк, но не более того.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 10:58     Как задать локаль для потока? #10
OhMyGodSoLong, То не совсем так. В С++11 появились новые codecvt-шки и конвертеры wstring_converter, wbuffer_converter.
http://en.cppreference.com/w/cpp/locale
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
~ Эврика! ~
1243 / 992 / 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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 13:20  [ТС]     Как задать локаль для потока? #13
Куда этот буст копирожать?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 13:39     Как задать локаль для потока? #14
taras atavin, В доке ведь все написано... Инсталлируете через b2 библиотеки. Указываете куда инсталлировать (prefix). Инсталлируете. Прописываете в путях IDE диру к либам и диру к хедерам. Наверняка где-нибудь есть уже собранный буст для винды.
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 14:12     Как задать локаль для потока? #16
taras atavin, Гугл. Реально гугл в помощь. Буст ничем не отличается от любых других сторонних библиотек в плане подключения к IDE.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 16:40  [ТС]     Как задать локаль для потока? #17
Где мне вообще искать в моей IDE, где она ищет головы? Без относительно буста.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.05.2013, 16:41     Как задать локаль для потока? #18
taras atavin, Ну, это вам лучше знать. В настройках. http://wiki.codeblocks.org/index.php...iler_variables
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++
Есть такая задача: Напишите фрагмент кода, который динамически выделит память для структуры, описанной в вопросе 6, и затем прочитает...

Как задать путь для файла в fstream? - C++
Как задать путь для хранения файлов, созданныхofstream fout; fout.open(&quot;text.txt&quot;,ios::app); при помощи:

Как задать псевдоним для указателя на структуру - C++
Подскажите. пожалуйста, можно как нибудь задать псевдоним для указателя на структуру Т.е. я пытался сделать что то вроде такого ...

Русская локаль - C++
Задача: сделать так, чтобы &quot;cout&quot; был без кракозяблов, в программах где небыло классов, в тело функции вставлял...

локаль(locale) - C++
int main() { std::locale::global(std::locale(&quot;rus&quot;)); //std::cout.imbue(std::locale(&quot;rus&quot;)); std::cout &lt;&lt; &quot;привет!&quot;; ...


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

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

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