4 / 4 / 6
Регистрация: 07.01.2013
Сообщений: 136
1

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

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

Author24 — интернет-сервис помощи студентам
Имеется некоторая программа (шутка, прога ещё в проекте). Она по сути является одним из кусков системы общения (пишу себе псевдоИИ, но не важно). Естественно, ей могут выдать слова любого языка, а значит, нужно использовать кодировку 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2013, 14:51
Ответы с готовыми решениями:

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

getBytes('UTF-16') даёт UTF-16LE или UTF-16BE?
Добрый день! Делаю J2ME-клиента к некому серверу, исходников которого у меня нет, но есть...

<globalization fileEncoding='utf-8' requestEncoding='utf-8' responseEncoding='utf-8' />
Если в коде пишу строку скажем Response.Write ('Вася дурак') - все срабатывает нормально, а если в...

XmlSerializer.Serialize() как поменять кодировку с UTF-16 на UTF-8
Задача серилизовать объект в string, но с кодировкой UTF-8. подзадача - как представить строку как...

16
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.11.2013, 15:14 2
Цитата Сообщение от k1-801 Посмотреть сообщение
у в общем, виндовые консоли юзают другую кодировку, а значит, нужно
Поменять кодировку консоли на UTF-8

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

Добавлено через 1 час 20 минут
Тема что, заглохла? Ответ бы узнать какой-нибудь (-_-)
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.11.2013, 16:41 4
Дык я написал, или код UTF-8 погулить слабо ?
0
4 / 4 / 6
Регистрация: 07.01.2013
Сообщений: 136
19.11.2013, 17:21  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
Дык я написал, или код UTF-8 погулить слабо ?
Простите, пытался найти... Что-то у меня сегодня день какой-то... Не идёт процесс ни в какую. Можно сразу команду?

Добавлено через 34 минуты
Что-то уже довольно много перекопал - и ничего...
0
12 / 12 / 2
Регистрация: 09.11.2013
Сообщений: 85
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
4 / 4 / 6
Регистрация: 07.01.2013
Сообщений: 136
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
5498 / 4893 / 831
Регистрация: 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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.11.2013, 18:13 9
alsav22, юу нафига ставить 1251 когда надо UTF8? что бы потом перековерчивать ручками ?
0
4 / 4 / 6
Регистрация: 07.01.2013
Сообщений: 136
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.11.2013, 18:17 11
Цитата Сообщение от k1-801 Посмотреть сообщение
Оно везде одинаково будет или в лини не скомпилится?
Только под виндой.
0
5498 / 4893 / 831
Регистрация: 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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.11.2013, 18:45 15
OEM -> cp866
0
4 / 4 / 6
Регистрация: 07.01.2013
Сообщений: 136
20.11.2013, 13:33  [ТС] 16
Кое-как я сумел запустить винду. Таки запустил. И даже раздобыл Visual C++! Если оно заработает - отпишусь о результатах.
Можно ключ винды для #ifdef?

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

Добавлено через 17 часов 49 минут
Использовал ключ WIN32. Вроде я придумал как это сделать...
Я сделал классы UTF8_char и UTF8_string, почти сделал конвертер CP866 -> UTF-8. Как определить текущую кодовую страницу консоли?
0
4 / 4 / 6
Регистрация: 07.01.2013
Сообщений: 136
20.11.2013, 15:48  [ТС] 17
Вот. Пока всё что смог сделать для представления UTF-8.
Вложения
Тип файла: zip UTF8.h.zip (696 байт, 44 просмотров)
0
20.11.2013, 15:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2013, 15:48
Помогаю со студенческими работами здесь

Изменить кодировку из utf-8 без bom в просто utf-8
формируется xls фаил в коде прописано...

Как создать рабочий XML в UTF-8? У меня исправно создаётся Windows-1251, но с UTF-8 проблема
Доброго дня, форумчане. Подскажите, что делать, чтобы создавался и открывался без ошибок...

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

Преобразование Unicode (UTF-16) в UTF-8 и обратно
Здравствуйте. Признаюсь, снова нужна подмога профессионалов. :help: Перейду к проблеме: Есть файл...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru