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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 14:51     C++, UTF-8 и совместимость #1
Имеется некоторая программа (шутка, прога ещё в проекте). Она по сути является одним из кусков системы общения (пишу себе псевдоИИ, но не важно). Естественно, ей могут выдать слова любого языка, а значит, нужно использовать кодировку 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 и совместимость
Посмотрите здесь:

C++ From UTF-8 to UNICODE
C и UTF-8 C++
Преобразовние Utf-16 <=> Utf-8 C++
Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 C++
C++ Кириллица в UTF-8
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
19.11.2013, 15:14     C++, UTF-8 и совместимость #2
Цитата Сообщение от k1-801 Посмотреть сообщение
у в общем, виндовые консоли юзают другую кодировку, а значит, нужно
Поменять кодировку консоли на UTF-8

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

Добавлено через 1 час 20 минут
Тема что, заглохла? Ответ бы узнать какой-нибудь (-_-)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
19.11.2013, 16:41     C++, UTF-8 и совместимость #4
Дык я написал, или код UTF-8 погулить слабо ?
k1-801
 Аватар для 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
 Аватар для 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
5282 / 4801 / 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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
19.11.2013, 18:13     C++, UTF-8 и совместимость #9
alsav22, юу нафига ставить 1251 когда надо UTF8? что бы потом перековерчивать ручками ?
k1-801
 Аватар для 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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
19.11.2013, 18:17     C++, UTF-8 и совместимость #11
Цитата Сообщение от k1-801 Посмотреть сообщение
Оно везде одинаково будет или в лини не скомпилится?
Только под виндой.
alsav22
5282 / 4801 / 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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
19.11.2013, 18:45     C++, UTF-8 и совместимость #15
OEM -> cp866
k1-801
 Аватар для 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 и совместимость
Еще ссылки по теме:

C++, UTF-8, char C++
Считать utf-8 из файла C++
C++ Парсер, utf-8

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

Или воспользуйтесь поиском по форуму:
k1-801
 Аватар для 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 байт, 15 просмотров)
Yandex
Объявления
20.11.2013, 15:48     C++, UTF-8 и совместимость
Ответ Создать тему
Опции темы

Текущее время: 18:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru