Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
#1

C++, UTF-8 и совместимость - C++

19.11.2013, 14:51. Просмотров 2310. Ответов 16
Метки нет (Все метки)

Имеется некоторая программа (шутка, прога ещё в проекте). Она по сути является одним из кусков системы общения (пишу себе псевдоИИ, но не важно). Естественно, ей могут выдать слова любого языка, а значит, нужно использовать кодировку UTF-8. В терминале Ubuntu всё абсолютно нормально (не всегда распознаёт буквы, но работает). В винде... Ну в общем, виндовые консоли юзают другую кодировку, а значит, нужно взорвать Microsoft либо замкнуть на кириллице и научить понимать UTF-8 либо замкнуть на кириллице для винды и понимать винду. Какой способ лучше и как осуществить их оба?

P.S. Для условности:
C++
1
2
3
4
string in;
getline(cin,in);
/*приводим в одну из сторон*/
fw(in);
P.P.S. Есть ещё вариант - смотреть в какой кодировке поданы данные на вход и, соответственно, передать в нужном виде на пережёвывание в UTF-8... Но как это делать - понятия не имею.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 14:51     C++, UTF-8 и совместимость
Посмотрите здесь:

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

C и UTF-8 - C++
Как для приложения на C установить кодировку UTF-8? Чтобы символы на кирилице выводились и вводились нормально.

Кириллицу в UTF-8 - C++
К примеру, у нас есть строка &quot;тест&quot;, нужно из него получить строку D1%82%D0%B5%D1%81%D1%82 для запроса

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

C++, UTF-8, char - C++
Приветсвую всех. Правильно ли я рассуждаю: 1) Если мне нужно использовать символы юникода в программе (самые немыслимые иероглифы,...

Кириллица в UTF-8 - C++
Отдельно задам ранее возникший вопрос. При работе с однобайтовой кодировкой (например, в старом борланде 3.1, где, если я правильно понял,...

From UTF-8 to UNICODE - C++
здравствуйте!! у меня вот какой вопрос! Как сделать преобразование UTF-8 и Unicode? во общем моя программа считывает данные с базы( база...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,266
Записей в блоге: 17
19.11.2013, 15:14     C++, UTF-8 и совместимость #2
Цитата Сообщение от k1-801 Посмотреть сообщение
у в общем, виндовые консоли юзают другую кодировку, а значит, нужно
Поменять кодировку консоли на UTF-8

C++
1
system("chcp  <код для UTF-8>"); // код для UTF-8 не помню, нужно смотреть
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 16:36  [ТС]     C++, UTF-8 и совместимость #3
Цитата Сообщение от Avazart Посмотреть сообщение
Поменять кодировку консоли на UTF-8
Так, ответ радует, можно узнать как?)

Добавлено через 1 час 20 минут
Тема что, заглохла? Ответ бы узнать какой-нибудь (-_-)
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,266
Записей в блоге: 17
19.11.2013, 16:41     C++, UTF-8 и совместимость #4
Дык я написал, или код UTF-8 погулить слабо ?
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 17:21  [ТС]     C++, UTF-8 и совместимость #5
Цитата Сообщение от Avazart Посмотреть сообщение
Дык я написал, или код UTF-8 погулить слабо ?
Простите, пытался найти... Что-то у меня сегодня день какой-то... Не идёт процесс ни в какую. Можно сразу команду?

Добавлено через 34 минуты
Что-то уже довольно много перекопал - и ничего...
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
19.11.2013, 17:22     C++, UTF-8 и совместимость #6
Цитата Сообщение от k1-801 Посмотреть сообщение
Простите, пытался найти... Что-то у меня сегодня день какой-то... Не идёт процесс ни в какую. Можно сразу команду?

Добавлено через 34 минуты
Что-то уже довольно много перекопал - и ничего...
C++
1
#include <boost/detail/utf8_codecvt_facet.hpp>
Ну если через system, то

C++
1
system("chcp 65001")
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 17:50  [ТС]     C++, UTF-8 и совместимость #7
Возможно, я некорректно объяснил суть...
Итак. Есть некий код (ужасный, но всё-таки код). Он получает на вход строку текста, обрабатывает, что-то читает из файла, а что-то пишет в тот же файл, что-то выдаёт на экран. Суть в том чтобы при запуске этого кода на любой допустимой ОС в файл и на экран выдавалось в правильном формате (и нигде при чтении файла после работы над ним того же кода из другой ОС кракозябр не будет). Если надо объяснить суть программы... Она формирует базу слов, но значения это не имеет. Соответственно, надо приучить винду к UTF-8. Вопрос только как.

Добавлено через 37 секунд
Цитата Сообщение от IntelCoreDuo Посмотреть сообщение
C++
1
#include <boost/detail/utf8_codecvt_facet.hpp>
Ну если через system, то

C++
1
system("chcp 65001")
Оно везде одинаково будет или в лини не скомпилится?

Добавлено через 1 минуту
В лини:
Bash
1
2
~/a.out
sh: 1: chcp not found
Дальше работает как обычно.

Добавлено через 2 минуты
А первое... Ну в общем первое вообще не скомпилилось.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 18:11     C++, UTF-8 и совместимость #8
Цитата Сообщение от k1-801 Посмотреть сообщение
Суть в том чтобы при запуске этого кода на любой допустимой ОС в файл и на экран выдавалось в правильном формате (и нигде при чтении файла после работы над ним того же кода из другой ОС кракозябр не будет).
Это навряд ли получится сделать.
Цитата Сообщение от k1-801 Посмотреть сообщение
Соответственно, надо приучить винду к UTF-8.
Из файла с UTF-8 на консоль в windows:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[500];
    wchar_t wbuff[500];
 
    ifstream f("upload.txt");
    
    f.getline(buff, 500); // в буффер char из файла UTF-8.
    
    MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500); //из буфера char в буфер wchar_t .
    setlocale(0, "rus_rus.866"); // //включаем другую кодировку.
    wcout << wbuff << endl; // выводим содержимое буфера wchar_t
    
    setlocale(0, ".1251"); // вернули кодировку.
    
    system("pause");
    return 0;
}
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,266
Записей в блоге: 17
19.11.2013, 18:13     C++, UTF-8 и совместимость #9
alsav22, юу нафига ставить 1251 когда надо UTF8? что бы потом перековерчивать ручками ?
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 18:14  [ТС]     C++, UTF-8 и совместимость #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Это навряд ли получится сделать.

Из файла с UTF-8 на консоль в windows:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[500];
    wchar_t wbuff[500];
 
    ifstream f("upload.txt");
    
    f.getline(buff, 500); // в буффер char из файла UTF-8.
    
    MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500); //из буфера char в буфер wchar_t .
    setlocale(0, "rus_rus.866"); // //включаем другую кодировку.
    wcout << wbuff << endl; // выводим содержимое буфера wchar_t
    
    setlocale(0, ".1251"); // вернули кодировку.
    
    system("pause");
    return 0;
}
1) Зачем два раза ставить кодировку (к тому же как я понял не используемую)?
2) А возможно сделать для функции проверку на виндовость (типа #ifdef WIN)?
P.S. А вот такая бредятина заработает?)
C++
1
setlocale(0, ".65001");
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,266
Записей в блоге: 17
19.11.2013, 18:17     C++, UTF-8 и совместимость #11
Цитата Сообщение от k1-801 Посмотреть сообщение
Оно везде одинаково будет или в лини не скомпилится?
Только под виндой.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 18:21     C++, UTF-8 и совместимость #12
Цитата Сообщение от k1-801 Посмотреть сообщение
1) Зачем два раза ставить кодировку (к тому же как я понял не используемую)?
Какая не используемая?

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
alsav22, юу нафига ставить 1251 когда надо UTF8? что бы потом перековерчивать ручками ?
Какой код был, такой и выложил. Тут использование двух кодировок в консоли, в windows. ТС пусть сам разбирается, что ему нужно.
Avazart
19.11.2013, 18:23
  #13

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Тут использование двух кодировок.
Трех ...
Цитата Сообщение от alsav22 Посмотреть сообщение
Какой код был, такой и выложил.
Хлам...

alsav22
19.11.2013, 18:43
  #14

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Трех ...
Какая третья?
Цитата Сообщение от Avazart Посмотреть сообщение
Хлам...
Может быть... Код не мой, где-то попался, как способ вывода файла UTF-8 в консоль windows.

Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,266
Записей в блоге: 17
19.11.2013, 18:45     C++, UTF-8 и совместимость #15
OEM -> cp866
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
20.11.2013, 13:33  [ТС]     C++, UTF-8 и совместимость #16
Кое-как я сумел запустить винду. Таки запустил. И даже раздобыл Visual C++! Если оно заработает - отпишусь о результатах.
Можно ключ винды для #ifdef?

Добавлено через 53 минуты
Винда проигнорировала setlocale(0, ".65001");

Добавлено через 17 часов 49 минут
Использовал ключ WIN32. Вроде я придумал как это сделать...
Я сделал классы UTF8_char и UTF8_string, почти сделал конвертер CP866 -> UTF-8. Как определить текущую кодовую страницу консоли?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 15:48     C++, UTF-8 и совместимость
Еще ссылки по теме:

из UTF-8 в Windows-1251 - C++
Как строку в формате UTF-8 перекодировать в Windows-1251? Добавлено через 16 минут Существуют ли какие-нибудь функции?

Libiconv конвертирование в UTF-8? - C++
Странное поведение консоли виндовс с UTF-8 Кто имел дело с libiconv есть ли у вас предположения почему так ? С помощью других кодировок...

Utf-8. И снова кодировки - C++
Доброго времени суток. Подскажите как конвертировать всё введённое с клавиатуры в utf-8. Т.е. консоль запускается в какой-то стране Мира,...

Считать utf-8 из файла - C++
Доброго времени суток. Задача следующая. Есть текстовый файл - словарь в utf-8 кодировке. Слова разделены переводом строки. Считываю...

Создание файла в UTF-8 кодировке - C++
Здравствуйте! Как сделать что бы в данной ситуации файл создавался в utf-8 DWORD tmp0; TCHAR buffer; bool test; ...


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

Или воспользуйтесь поиском по форуму:
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
20.11.2013, 15:48  [ТС]     C++, UTF-8 и совместимость #17
Вот. Пока всё что смог сделать для представления UTF-8.
Вложения
Тип файла: zip UTF8.h.zip (696 байт, 16 просмотров)
Yandex
Объявления
20.11.2013, 15:48     C++, UTF-8 и совместимость
Ответ Создать тему
Опции темы

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