Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

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

06.05.2013, 08:29. Показов 5684. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет. Если поставить
C++
1
Fille.imbue("ru_RU.UTF8");
, или
C++
1
std::locale::global(std::locale("ru_RU.UTF8"));
, прога аварийно завершается.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.05.2013, 08:29
Ответы с готовыми решениями:

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

Можно ли задать ограничения для итератора потока ввода?
Изучая c++, наткнулся на такой способ заполнения вектора из потока. istream_iterator< int > input(cin); istream_iterator< int...

Как сменить локаль? Хотя бы для вывода времени
#include <QtCore> int main(int argc, char *argv) { QCoreApplication a(argc, argv); QDateTime oldTime =...

31
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
06.05.2013, 19:26  [ТС]
Студворк — интернет-сервис помощи студентам
А где?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.05.2013, 19:30
Цитата Сообщение от taras atavin Посмотреть сообщение
Задача прочитать UTF-8 без BOM из файла в std::wstring. Однобайтные символы читаются, а кириллица нет.
Прочитайте содержимое файла в буфер, а затем вызовите MultiByteToWideChar с CodePage = CP_UTF8.
Получите строку в UTF-16 Little Endian, которую можно будет передать в wstring.
Тащить для такой мелкой задачи Boost и ICU (особенно ввиду объема последней) - страшный overkill.
2
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.05.2013, 09:41  [ТС]
Дополнительное условие: приложение должно распространяться только в бинарниках, под другой лицензией и иметь закрытый исходный текст.

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

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

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

Цитата Сообщение от taras atavin Посмотреть сообщение
3. Преобразование происходит в самом буфере?
Да.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.05.2013, 09:48
taras atavin, 1) char же (в терминах майкрософта LPCSTR).
2) http://en.cppreference.com/w/c... ream/seekg
http://en.cppreference.com/w/c... ream/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-u... 85%29.aspx
1
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.05.2013, 14:50  [ТС]
А где брать cbMultiByte и cchWideChar и какого размера создавать lpWideCharStr? http://msdn.microsoft.com/en-u... s.85).aspx.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
09.05.2013, 20:05
Цитата Сообщение от taras atavin Посмотреть сообщение
где брать cbMultiByte и cchWideChar
Мне вас читать учить? Это размеры входного и выходного буферов. В байтах и wchar_t соответственно. Вот где выделяете память под буферы, там и берите.

Цитата Сообщение от taras atavin Посмотреть сообщение
и какого размера создавать lpWideCharStr
Из параноидального расчёта: 1 wchar_t на каждый байт входной последовательности. Вообще на один кириллический символ уходит по два-три байта UTF-8 или один двухбайтовый символ UTF-16, но лучше обойтись без сюрпризов, потому что на пробелы и всякие точки-скобочки уходит по одному байту UTF-8.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.05.2013, 20:33
MultiByteToWideChar умеет возвращать необходимый размер буфера, если ее "попросить",
указав в cchWideChar нулевое значение. Только учитывайте, что она, в зависимости от
аргументов, может формировать выходной буфер без завершающего нуля.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.05.2013, 21:03  [ТС]
Вообще не понял. Куда она будет писать результат преобразования, если память не выделялась? И как она вернёт размер буфера в байтах и в символах?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.05.2013, 21:11
Если вкратце. Есть буфер, размер которого известен, с текстом в кодировке 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.
3
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2013, 14:08  [ТС]
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Это размеры входного и выходного буферов. В байтах и wchar_t соответственно.
Со входным поняно. Но как сосчитать символы? И сколько надо выделить памяти на wchar_t-буфер?

Добавлено через 35 минут
Повторно вызвал. Как теперь загнать эту строку в std::wstring? Можно написать
C++
1
Result=wchar_tBuffer;
?
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.01.2020, 18:52
Цитата Сообщение от Убежденный Посмотреть сообщение
MultiByteToWideChar умеет возвращать необходимый размер буфера, если ее "попросить",
указав в cchWideChar нулевое значение. Только учитывайте, что она, в зависимости от
аргументов, может формировать выходной буфер без завершающего нуля.
Здравствуйте,
Если я правильно понял, то при нулевом cchWideChar, MultiByteToWideChar возвращает не размер бфера, то есть не размер байт, а кол-во преобразованных символов utf16, то есть размер буфера все таки определить не удается.

Добавлено через 6 минут
Или же я немного не прав и MultiByteToWideChar возвращает не кол-во символов, а кол-во двухбайтовых wchar_t байт, скорее наверное так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2020, 18:52

Как в Qt задать локаль типа "rus-rus" ?
Ну наверное системную локаль... Чтоб это было кроссово.... :) Добавлено через 39 минут Меня даже больше интересует, вот этот вот...

как задать имя потока из строки?
есть поток ifstream - входные файлы, задаю его так: ifstream infile(s1); s1 задается же так: int i; i=1; AnsiString s; ...

Мьютексы-потоки: Как задать время выполнения потока
Подскажите пожалуйста насчет следующих вопросов, сам не разобрался. 1. Как задать время выполнения потока? 2. Как заставить потоки...

Почему длинна потока это целое типа LONG, а смещение (offset) можно задать как INT
Доброго времени суток уважаемые! Объясните мне пожалуйста, почему длинна потока это целое типа LONG, а смещение (offset) можно задать как...

Установить локаль для приложения
Можно ли установить локаль приложения, независимо от установленной на компе пользователя? С тем, чтобы fromLocal8Bit(char *) работала...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru