Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

06.05.2013, 08:29. Просмотров 1767. Ответов 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++):

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

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

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

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

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

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

30
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 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
3888 / 1762 / 92
Регистрация: 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
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 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
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 09:48  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
. Задача считать именно в wstring и кодировка файла точно utf8?
Да, но не обязательно на прямую. А если читать в std::string, то при этом файл перекодируется в ansi? Или останется в utf-8? И как потом привести одну строку к другой?
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 10:13 #6
taras atavin, Файл никуда не перекодируется. В std::string нормально считывается и выводится или есть некие проблемы?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:15 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Юникод читается и обрабатывается с помощью вот этого. wstring — ересь и полумеры.
3
taras atavin
3888 / 1762 / 92
Регистрация: 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 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.05.2013, 10:46 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это?
Это кроссплатформенная библиотека для работы с Юникодом. Она очень полезна, чтобы вот эти вопросы не возникали
Читается ли туда сам файл, или результат его перекодирования в ansi в озу?
И при этом не зависеть от локализации винды.
А если читать в std::string, то при этом файл перекодируется в ansi?
И как потом привести одну строку к другой?
wchar_t — это по определению платформо- и локалезависимый тип символов "побольше, чем char". Больше там никаких гарантий нет. Си++ не умеет искаропки Юникод. Даже в Си++11 появились только типы соответствующих подходящих строк, но не более того.
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 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
3888 / 1762 / 92
Регистрация: 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 / 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/любая-другая-сторонняя-библиотека.
0
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
06.05.2013, 13:20  [ТС] #13
Куда этот буст копирожать?
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.05.2013, 13:39 #14
taras atavin, В доке ведь все написано... Инсталлируете через b2 библиотеки. Указываете куда инсталлировать (prefix). Инсталлируете. Прописываете в путях IDE диру к либам и диру к хедерам. Наверняка где-нибудь есть уже собранный буст для винды.
0
taras atavin
3888 / 1762 / 92
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 14:10
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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