Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45

Конвертер символов в юникод

04.11.2018, 13:21. Показов 5229. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите создать программу, которая считывает файл побайтно и если значение байта >=128 совершает замену символа (из CP437 в UTF-8).


У меня есть некоторые "черновики":
Считывание побайтно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
   ifstream fin("input.txt");
char c;
while(!fin.eof())
{
fin.get(c);
if(!fin.eof())
cout<<c;
}
}

Decimal в UTF-8:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
  int d;
  cout<<"DEC: ";
  cin>>d;
    wchar_t c = static_cast<wchar_t>(d);
    wcout << "UTF-8: "<< c << endl;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2018, 13:21
Ответы с готовыми решениями:

Использование Юникод символов
Здравствуйте. Возможно ли в C++ Builder включить поддержку юникод символов прям в коде?

Конвертер TTF-шрифтов в BMP с координатами символов
Приветствую форумчане! Есть задача: создать программу (консольную) для конвертации TTF-шрифтов в BMP с координатами символов в INI. Символы...

Конвертер из CSV файла в таблицу из ASCII символов
Доброго времени суток, есть задачка: Разработать конвертор из CSV файла в таблицу из ASCII символов. Первая строка файла задает типы...

21
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2018, 13:42
Файл в какой кодировке?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,911
04.11.2018, 18:29
Цитата Сообщение от SonyHD Посмотреть сообщение
из CP437 в UTF-8
так что CP437 скорее всего.
Посмотрите в сторону iconv
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
04.11.2018, 18:49  [ТС]
nmcf, CP437.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2018, 20:27
В WinAPI есть функции для перекодирования.
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
04.11.2018, 21:32  [ТС]
nmcf, MultiByteToWideChar? Не знаю насколько эта функция эффективна. Так как была у меня такая же программа на С, и она как бы меняла декодирование из нормального ANSI в UTF-8, но в самом тексте символы так и не поменялись.

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
28
29
30
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[], char *envp[])
{ FILE *SrcFile;
  FILE *DstFile;
  char ch;
  wchar_t wch;
 
  if(argc > 1)
  { if((SrcFile = fopen("input.txt", "rb")) == NULL) return 1;
    if((DstFile = fopen("output.txt","wb+")) == NULL) return 1;
 
    fputc(0xFF, DstFile);
    fputc(0xFE, DstFile);
 
    while(TRUE)
    { ch = fgetc(SrcFile);
      if(feof(SrcFile)) break;
 
      MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, &ch, 1, &wch, 1);
      fputwc(wch, DstFile);
    }
    fclose(SrcFile);
    fclose(DstFile);
  }
  else { printf("Error"); }
  return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2018, 23:50
Считывать и перекодировать надо строками, а не по одному символу. И если, как ты говоришь, там 437, то почему указано CP_ACP?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,911
05.11.2018, 01:23
Вот так вроде работает (проверку на ошибки не делал, пусть ТС сам развлекается). Ну и вместо CP437 взял KOI8-R, как более подходящий для проверки:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <iconv.h>
 
int main(){
  char str[1000];
  char res[1000];
  size_t s_in, s_out;
  iconv_t descr = iconv_open("UTF8", "KOI8-R");
  
  while(fgets(str, 999, stdin) != NULL){
    s_in=999;
    s_out=999;
    char *inp = str;
    char *outp= res;
    iconv(descr, &inp, &s_in, &outp, &s_out);
    puts(res);
  }
  
  iconv_close(descr);
}
Code
1
2
3
$ gcc main.c
$ echo "affАБВФЫВ" | iconv -t KOI8-R | ./a.out 
affАБВФЫВ
Добавлено через 1 час 9 минут
А вот способа запустить iconv на windows я не нашел. Перепробовал несколько реализаций, но, похоже, есть какие-то тонкости по размещению библиотек
1
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
05.11.2018, 10:05  [ТС]
COKPOWEHEU, спасибо.
nmcf, переписал программу. Считывает весь файл в буффер. CP_ACP это кодировка ANSI. С СP437 как то не получается - пустой файл (output.txt) создается. А результат c CP_ACP такой же как и упоминал - меняется кодировка в настройках notepad а сами символы не меняются. Возможно стоит их в консоль выводить, а не сохранить в файл? Или есть какие нибудь другие способы как это "пофиксить"?

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
28
29
30
31
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    FILE* src = fopen("input.txt", "rb");
    if(!src) return 0;
 
    FILE* dst = fopen("output.txt", "wb");
    if(!dst) return 0;
 
    fseek(src, 0, SEEK_END);
    long filesize = ftell(src);
    char *ansi = malloc(filesize);
 
    fseek(src, 0, SEEK_SET);
    fread(ansi, 1, filesize, src);
 
    int codepage = CP_ACP;
    int u16size = MultiByteToWideChar(codepage, 0, ansi, filesize, NULL, 0);
    wchar_t *u16 = malloc(u16size * sizeof(wchar_t));
    MultiByteToWideChar(codepage, 0, ansi, filesize, u16, u16size);
 
    int u8size = WideCharToMultiByte(CP_UTF8, 0, u16, u16size, NULL, 0, NULL, FALSE);
    char *u8 = malloc(u8size);
    WideCharToMultiByte(CP_UTF8, 0, u16, u16size, u8, u8size, NULL, FALSE);
 
    fwrite(u8, 1, u8size, dst);
    return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.11.2018, 12:05
Что значит "меняется кодировка в настройках notepad а сами символы не меняются"? Символы и не должны меняться.
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
05.11.2018, 12:34  [ТС]
nmcf, если символы не должны меняться, тогда какая суть конвертирования?
Цитата Сообщение от nmcf Посмотреть сообщение
Что значит "меняется кодировка в настройках notepad а сами символы не меняются"
см. на фото.
Миниатюры
Конвертер символов в юникод   Конвертер символов в юникод   Конвертер символов в юникод  

Конвертер символов в юникод  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.11.2018, 13:58
Ну ты перекодируешь в другой формат. Отображение от этого и не должно меняться.
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
05.11.2018, 14:07  [ТС]
nmcf, а как именно поменять отображение?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.11.2018, 14:18
Что ты хочешь получить? Пример.
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
05.11.2018, 15:41  [ТС]
nmcf, программа должна найти в тексте "неправильные символы" и исправить их (в примере А с умляутом соответствует знак "-" , а буква похожая на "ž" соответствует знак квадратa).
Миниатюры
Конвертер символов в юникод   Конвертер символов в юникод  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.11.2018, 17:07
Откуда этот файл и почему он отображается нормально справа?
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
05.11.2018, 17:46  [ТС]
Файл дан вместе с задачей. А что касается к отображению - текст просто печатается в консоле и наверное, как то сама консоль его декодирует:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
   ifstream fin("input.txt");
char c;
while(!fin.eof())
{
fin.get(c);
if(!fin.eof())
cout<<c;
}
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.11.2018, 18:08
И цветом само выделяется? Загрузи сюда этот файл.
0
0 / 0 / 0
Регистрация: 15.10.2018
Сообщений: 45
05.11.2018, 18:48  [ТС]
Нет, цветом выделил я. Файл слишком большой, могу как-нибудь только часть вложить.

Вот одна часть текстового файла input.txt:
https://pastebin.com/P0sH9tX5
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.11.2018, 19:12
Так не пойдёт. При копировании, могут быть искажения.
Судя по этому куску там по два байта на эти неправильные символы. Может, это уже и есть utf-8?
Ты дамп можешь показать, чтобы эти символы были видны вместе с их кодами?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.11.2018, 19:12
Помогаю со студенческими работами здесь

Юникод
Даны случайные символы , переводить его в Unicode и в таком виде выводить его на экран и наоборот. {class Chisla{ char arr = new...

Юникод в XE
function GetFileList(const Path: String): string; var a: Cardinal; fa: _WIN32_FIND_DATAA; begin result:=''; TRY ...

Юникод
На одной странице 2816 символов. Сколько КБ информации занимает память компьютера, если текст, создан в Unicode?

Юникод в Си++
Здравствуйте. int main(int argc, char *argv) { wstring s1 = L&quot;abracadabra&quot;; cout &lt;&lt; s1.size() &lt;&lt; endl; // 11 ...

Юникод в с++
Есть код с использованием wstring,wchar_t,wcin,wcout в котором открывается файл в кодировке Юникод но почему-то выводит абракадабру. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru