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

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

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

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

06.05.2013, 08:29. Просмотров 1669. Ответов 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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.05.2013, 14:12 #16
taras atavin, Гугл. Реально гугл в помощь. Буст ничем не отличается от любых других сторонних библиотек в плане подключения к IDE.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 16:40  [ТС] #17
Где мне вообще искать в моей IDE, где она ищет головы? Без относительно буста.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.05.2013, 16:41 #18
taras atavin, Ну, это вам лучше знать. В настройках. http://wiki.codeblocks.org/index.php?title=Global_compiler_variables
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 17:32  [ТС] #19
А у меня здесь пусто.

Добавлено через 47 минут
Всё, буст воткнул. А как его юзать для загрузки уникода?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.05.2013, 18:06 #20
taras atavin, Читать документацию по boost::locale.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.05.2013, 19:26  [ТС] #21
А где?
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
06.05.2013, 19:30 #22
Цитата Сообщение от taras atavin Посмотреть сообщение
Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет.
Прочитайте содержимое файла в буфер, а затем вызовите MultiByteToWideChar с CodePage = CP_UTF8.
Получите строку в UTF-16 Little Endian, которую можно будет передать в wstring.
Тащить для такой мелкой задачи Boost и ICU (особенно ввиду объема последней) - страшный overkill.
2
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.05.2013, 09:41  [ТС] #23
Дополнительное условие: приложение должно распространяться только в бинарниках, под другой лицензией и иметь закрытый исходный текст.

Добавлено через 1 минуту
Цитата Сообщение от Убежденный Посмотреть сообщение
Прочитайте содержимое файла в буфер, а затем вызовите MultiByteToWideChar с CodePage = CP_UTF8.
Получите строку в UTF-16 Little Endian, которую можно будет передать в wstring.
Цитата Сообщение от Убежденный Посмотреть сообщение
Прочитайте содержимое файла в буфер, а затем вызовите MultiByteToWideChar с CodePage = CP_UTF8.
1. Какого типа должен быть буфер?
2. Как перед чтением файла определить его размер?
3. Преобразование происходит в самом буфере?

Добавлено через 1 минуту
Дайте пожалуйста пример на эту функцию.
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
08.05.2013, 09:47 #24
Цитата Сообщение от taras atavin Посмотреть сообщение
1. Какого типа должен быть буфер?
char.

Цитата Сообщение от taras atavin Посмотреть сообщение
2. Как перед чтением файла определить его размер?
GetFileSizeEx.

Цитата Сообщение от taras atavin Посмотреть сообщение
3. Преобразование происходит в самом буфере?
Да.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
08.05.2013, 09:48 #25
taras atavin, 1) char же (в терминах майкрософта LPCSTR).
2) http://en.cppreference.com/w/cpp/io/basic_istream/seekg
http://en.cppreference.com/w/cpp/io/basic_istream/tellg
C++
1
2
3
fs.seekg(0, std::ios_base::end);
std::ios::pos_type size = fs.tellg();
fs.seekg(0, std::ios_base::beg);
3) http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 14:50  [ТС] #26
А где брать cbMultiByte и cchWideChar и какого размера создавать lpWideCharStr? http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.05.2013, 20:05 #27
Цитата Сообщение от taras atavin Посмотреть сообщение
где брать cbMultiByte и cchWideChar
Мне вас читать учить? Это размеры входного и выходного буферов. В байтах и wchar_t соответственно. Вот где выделяете память под буферы, там и берите.

Цитата Сообщение от taras atavin Посмотреть сообщение
и какого размера создавать lpWideCharStr
Из параноидального расчёта: 1 wchar_t на каждый байт входной последовательности. Вообще на один кириллический символ уходит по два-три байта UTF-8 или один двухбайтовый символ UTF-16, но лучше обойтись без сюрпризов, потому что на пробелы и всякие точки-скобочки уходит по одному байту UTF-8.
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
09.05.2013, 20:33 #28
MultiByteToWideChar умеет возвращать необходимый размер буфера, если ее "попросить",
указав в cchWideChar нулевое значение. Только учитывайте, что она, в зависимости от
аргументов, может формировать выходной буфер без завершающего нуля.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 21:03  [ТС] #29
Вообще не понял. Куда она будет писать результат преобразования, если память не выделялась? И как она вернёт размер буфера в байтах и в символах?
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
09.05.2013, 21:11 #30
Если вкратце. Есть буфер, размер которого известен, с текстом в кодировке UTF-8.
Текст нужно перевести в UTF-16.

Шаг 1 - определяем размер выходного буфера.
Для этого вызываем MultiByteToWideChar, указывая ноль в cchWideChar.
В описании этого параметра сказано: "If this value is 0, the function returns the
required buffer size, in characters, including any terminating null character, and makes
no use of the lpWideCharStr buffer". В случае успеха функция вернет необходимый
размер выходного буфера, в символах.

Шаг 2 - выделяем буфер необходимого размера (new/malloc/VirtualAlloc и т.п.).

Шаг 3 - вызываем функцию MultiByteToWideChar повторно, теперь в последних
параметрах указываем адрес и размер выходного буфера.

Особое внимание уделите вот этому фрагменту из описания функции:
cbMultiByte [in]

If this parameter is -1, the function processes the entire input string, including the
terminating null character. Therefore, the resulting Unicode string has a terminating
null character, and the length returned by the function includes this character.

If this parameter is set to a positive integer, the function processes exactly the
specified number of bytes. If the provided size does not include a terminating null
character, the resulting Unicode string is not null-terminated, and the returned
length does not include this character.
2
09.05.2013, 21:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 21:11
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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