Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677

Utf-8. И снова кодировки

28.10.2014, 19:30. Показов 5652. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Подскажите как конвертировать всё введённое с клавиатуры в utf-8.
Т.е. консоль запускается в какой-то стране Мира, там пользуют некий язык. Нужно определить текущую кодировку консоли и переконвертировать в utf-8...как? Виндось. Нужна функция вида:
C++
1
2
3
4
5
6
void gets_utf8(char*BUF)
{
      gets(BUF);
//определяем текущую кодировку, конвертируем в utf-8 и результат заносим в тот же массив, вместо исходных данных
//всё, мы молодцы. После завершения функции в переданном массиве содержится введённый текст в utf-8
}
Если можно, прямо результат, а не ссылки на чтиво, ибо чтиво я почитал и там как-то размыто для разных кодировок.
Надеюсь не слишком трудно будет жахнуть работающую реализацию подобной штуки. Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2014, 19:30
Ответы с готовыми решениями:

Перевод из кодировки UTF - 8 в ANSI
Всем привет! Пишу прогу на линухе, результаты работы вывожу в html файл. Так вот когда открываю файл для прочтения с помощью браузера там...

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32
Собсно сабж.

В чём отличия кодировки ms dos от кодировки ms windows?
Всем привет, подскажите в чём отличия кодировки ms dos от кодировки ms windows?

51
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
30.10.2014, 18:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nmcf Посмотреть сообщение
Я просто немного о другом сказал. wcin работает без переключения консоли на utf, и корректно формирует строку, но ограничен выбранной локалью.
Можно французскую установить.
Я не говорил, что он вообще не работает. Я говорил что он не работает правильно. А правильно - это когда без перекодировки и выбора локали. Зачем нам wchar_t и utf-16, если мы по факту ограничены текущей локалью? Это же неправильно. Тогда проще оставаться на 866 и char. Потому я и сказал, что правильно без юникодного режима это работать не будет. Чего вот придрались, я не пойму.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 19:03
Retyrn0, может лучше формой воспользоваться? Кто вообще станет вводить текст в консоль?
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
30.10.2014, 19:11  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
может лучше формой воспользоваться?
Лучше и я это потом буду реализовывать. Но проект по базам данных.
Во-первых, мне по старинному программерскому убеждению казалось, что консоль проще с точки зрения понимания принципов и естественных ходом веще будет перевод проект на окна.
Во-вторых, настоящая тру база данных просто обязана иметь консольный вариант, ибо иначе как-то беспантово

А вообще, теперь, когда я практически допонял как и что, стало ясно и то, что окна в этом плане проще - там и так всё в wchar_t без проблем вносится.

Добавлено через 2 минуты
Остаётся только вайдчартумультибайт и порядок...но до чего информация в нете намудрёная, хрен поймёшь сразу без ста граммов и помощи хорошо объясняющих) За что вам отдельное спасибо)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 19:18
codecvt проще использовать при записи файла, чем WideCharToMultibyte().
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
30.10.2014, 19:34  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
codecvt проще использовать при записи файла, чем WideCharToMultibyte().
А можно пример?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 19:37
Я же приводил пример, на второй странице смотри. Utf-8. И снова кодировки
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
30.10.2014, 20:14  [ТС]
Прошу прощения, запамятовал. Ну мне кажется всё-таки завернуть мультибайт ещё проще будет.

C++
1
2
3
4
5
6
7
BYTE*utf8(wchar_t*buf)
{
    char tempbuf[buf_len];
    WideCharToMultiByte(CP_UTF8,0,buf,-1,tempbuf,buf_len,NULL,NULL);
    CopyMemory(buf,tempbuf,strlen(tempbuf)+1);
    return (BYTE*)buf;
}
Не глядя на грубые нарушения, ибо накидал на глаз по-быстрому, получается достаточно такой хрени:

C++
1
fout<<utf8(wstr);
или вообще задефайнить эту чучу по тому же принципу. Разве не проще?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 20:20
Ну не знаю, как может быть такая конструкция проще стандартного для C++ codecvt.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
30.10.2014, 20:28  [ТС]
C++
1
locale loc (locale(), new codecvt_utf8<wchar_t, 0x10ffffUL, codecvt_mode::generate_header>);
Не совсем понимаю сдесь видимо к текущему моменту есть лишнее...
Или
C++
1
fout<<utf8(wstr);
Второй вариант ИМХО короче и понятнее. Хотя, возможно, если из первого варианта убрать баловство с локалями, то может получиться и проще...но сейчас оно выглядит довольно запутано.

Добавлено через 1 минуту
Я, например, сейчас не понимаю что убрать, чтобы аналогичный рзультат получить. Потому что впервые знакомлюсь с codecvt. Опыт не пропьёшь)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 20:29
Так это 1 раз задаётся при создании файлового потока. А потом вывод идёт просто
C++
1
fout << wstr;
И можно также числа выводить, например. Всё будет конвертироваться.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
30.10.2014, 20:35  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Код C++1
fout << wstr;
Убедительно)
Так я должен скопировать ту строку(куда-то) и подключить библиотеку(тоже не хотелось бы, ну да ладно)?
Я просто самого механизма не понимаю..там все языки будут работать?
Я может занудствую, просто сейчас тот вариант работает и мой мозг очень не хочет что-то меня, как в том анекдоте про сына программиста)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 20:39
codecvt в данном случае конвертирует wchar_t в utf8 при записи в файл. Язык определяется содержимым строки wchar_t.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2014, 20:39

Как сделать чтобы таймер дойдя до 0 стартовал снова и снова?
Здравствуйте :) Как сделать чтобы таймер дойдя до 0 стартовал снова и снова? TimerSec = 59; TimerMin = 6; for(int i = TimerSec;...

Кодировки (ошибки кодировки) в логировании
Здравствуйте. Работаю с WINAPI и оттуда нормально приходят наименования на русском. Вот решил логирование организовать и на этом повалился...

Преобразовние Utf-16 <=> Utf-8
Вопрос казалось бы простой, но нормально ответа на него я пока не нашел. Нужно вывести строчку юникода(UTF-16) в файл с изменением...

Снова ошибки кодировки UTF-8 именно подпись BOM
На WAMP создавая любой новый PHP скрипт с помощью Adobe Dreamweaver CS5.5 - файлу указывал UTF-8 (без BOM). И все нормально работало. На...

Разные кодировки файлов (ASCII, UTF-8, UTF-16)
Привет всем! Нужно написать программу поиска файлов, содержащих заданную строку. Т.е. пользователь выбирает начальный каталог, задаёт...


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
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, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru