Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

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

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

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

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

Как закончить ввод в итератор ввода для потока
По задумке в представленном ниже коде вводятся слова в консоль, потом как то...

Как задать шаг для x
не могу понять как задать 'x' в диапазоне, и куда приладить этот шаг 'h' для...

Как задать условие для функции
Добрый вечер! Например есть double Psi(double x) Нужно чтобы функция...

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

30
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 08:46 #2
taras atavin,
C++
1
File.imbue(std::locale("ru_RU.UTF8"));
Но тут возникает вопрос - есть-ли данная локаль в системе? Можно использовать буст или что-то вроде, где гарантированно реализован фасет для utf8.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 09:32 #4
taras atavin, Нету винды, а gcc и mingw (работающем через wine) вполне себе окей считывают в std::string, но не считывают в std::wstring, если кодировка файла utf8. Задача считать именно в wstring и кодировка файла точно utf8?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 09:48  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
. Задача считать именно в wstring и кодировка файла точно utf8?
Да, но не обязательно на прямую. А если читать в std::string, то при этом файл перекодируется в ansi? Или останется в utf-8? И как потом привести одну строку к другой?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 10:13 #6
taras atavin, Файл никуда не перекодируется. В std::string нормально считывается и выводится или есть некие проблемы?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:15 #7
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

Добавлено через 45 секунд
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Юникод читается и обрабатывается с помощью вот этого.
Что это?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:46 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это?
Это кроссплатформенная библиотека для работы с Юникодом. Она очень полезна, чтобы вот эти вопросы не возникали
Читается ли туда сам файл, или результат его перекодирования в ansi в озу?
И при этом не зависеть от локализации винды.
А если читать в std::string, то при этом файл перекодируется в ansi?
И как потом привести одну строку к другой?
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих подходящих строк, но не более того.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 10:58 #10
OhMyGodSoLong, То не совсем так. В С++11 появились новые codecvt-шки и конвертеры wstring_converter, wbuffer_converter.
http://en.cppreference.com/w/cpp/locale
1
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 11:23  [ТС] #11
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих строк, но не более того.
Проект с define UNICODE и я в конце концов нашёл, как в смой среде перекодировать исходник в utf8. И какая вообще возможна локалезависимость многобайтной кодировки? Внутренее представление толи в utf16, толи в utf32, то ли в прямом порядке байт, то ли в обратном. Какое мне вообще дело до версий уникода во внутреннем представлении? Но кириллица в арабский превращаться не будет, а если юзать utf to ansi, то на иноязычной винде буквы могут стать другими.
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 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
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 13:20  [ТС] #13
Куда этот буст копирожать?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 13:39 #14
taras atavin, В доке ведь все написано... Инсталлируете через b2 библиотеки. Указываете куда инсталлировать (prefix). Инсталлируете. Прописываете в путях IDE диру к либам и диру к хедерам. Наверняка где-нибудь есть уже собранный буст для винды.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 14:10  [ТС] #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Указываете куда инсталлировать (prefix)
А куда?

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

Добавлено через 1 минуту
вот смотри, пишу я
C++
1
#include <boost/numeric/ublas/vector.hpp>
, буст бросил в один каталог, кодоблоки ищут головы в другом. Не найдут, факт.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 14:12 #16
taras atavin, Гугл. Реально гугл в помощь. Буст ничем не отличается от любых других сторонних библиотек в плане подключения к IDE.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 16:40  [ТС] #17
Где мне вообще искать в моей IDE, где она ищет головы? Без относительно буста.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 16:41 #18
taras atavin, Ну, это вам лучше знать. В настройках. http://wiki.codeblocks.org/index.php?title=Global_compiler_variables
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 17:32  [ТС] #19
А у меня здесь пусто.

Добавлено через 47 минут
Всё, буст воткнул. А как его юзать для загрузки уникода?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 18:06 #20
taras atavin, Читать документацию по boost::locale.
0
06.05.2013, 18:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 18:06
Привет! Вот еще темы с решениями:

Как задать указатель для структуры (и не только)
Есть такая задача: Напишите фрагмент кода, который динамически выделит...

Как задать псевдоним для указателя на структуру
Подскажите. пожалуйста, можно как нибудь задать псевдоним для указателя на...

Как задать путь для файла в fstream?
Как задать путь для хранения файлов, созданныхofstream fout; ...

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


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

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

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