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

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

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

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

19.11.2013, 14:51. Просмотров 2687. Ответов 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... Но как это делать - понятия не имею.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 14:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос C++, UTF-8 и совместимость (C++):

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

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

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

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

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

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

16
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,154
Записей в блоге: 17
19.11.2013, 15:14 #2
Цитата Сообщение от k1-801 Посмотреть сообщение
у в общем, виндовые консоли юзают другую кодировку, а значит, нужно
Поменять кодировку консоли на UTF-8

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

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

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

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

C++
1
system("chcp 65001")
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 17:50  [ТС] #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 минуты
А первое... Ну в общем первое вообще не скомпилилось.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 18:11 #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;
}
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,154
Записей в блоге: 17
19.11.2013, 18:13 #9
alsav22, юу нафига ставить 1251 когда надо UTF8? что бы потом перековерчивать ручками ?
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 18:14  [ТС] #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");
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,154
Записей в блоге: 17
19.11.2013, 18:17 #11
Цитата Сообщение от k1-801 Посмотреть сообщение
Оно везде одинаково будет или в лини не скомпилится?
Только под виндой.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 18:21 #12
Цитата Сообщение от k1-801 Посмотреть сообщение
1) Зачем два раза ставить кодировку (к тому же как я понял не используемую)?
Какая не используемая?

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

Не по теме:

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

0
alsav22
19.11.2013, 18:43
  #14

Не по теме:

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

0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,154
Записей в блоге: 17
19.11.2013, 18:45 #15
OEM -> cp866
0
19.11.2013, 18:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 18:45
Привет! Вот еще темы с ответами:

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

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

utf-8 <-> int32 - C++
Есть строка s формата utf-8 длины l и число n типа int32 или uint32, которое является уникальным идентификатором строки s. Какие...

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


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

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

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