Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

Функция преобразующая строку из UTF-8 в Windows-1251

13.11.2016, 16:47. Показов 7117. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть программа на MS C++ 2008, которая производит считывание из текстового файла информации. Файл находится в кодировке UTF-8 без BOM (в других кодировках быть не может).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    const long long max_size = 2000;         // max length of strings
    char st1[max_size];
    a = 0;
    while( (st1[a] = fgetc(in)) != EOF ) 
    {
        if( (st1[a] == '\n') || (a >= max_size - 1) ) 
        {
            st1[a] = 0;
            break;
        }
        a++;
    }
    st1[a] = 0;
В результате строка
Code
1
перед использованием mt essentialmultivitamin прочитать инструкцию
Считывается как
Code
1
перед использованием mt essentialmultivitamin прочитать инструкцию
Собственно вопрос : есть ли у MVS функция приобразующая строку из UTF-8 в Windows-1251?
И если вместо
C++
1
char st1[max_size];
Напишу
C++
1
wchar_t st1[max_size];
Получу вот такой результат
Code
1
перед использованием mt essentialmultivitamin прочитать инструкциÑ
Подскажите, как правильно производить считывание документа, что бы не было проблем перевода с UTF-8 в Windows-1251. Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2016, 16:47
Ответы с готовыми решениями:

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

UTF-16 -> cp-1251(windows-1251)
У меня есть кириллическая строка UTF-16, которая выглядит как Хотелось бы конвертнуть её в cp-1251, чтобы она была читаема. Сколько...

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

9
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.11.2016, 20:41
Цитата Сообщение от Gdasar Посмотреть сообщение
прЕобразующая
MultiByteToWideChar function
Тип char* без ограничения на длину строки для хранения любых символов
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
13.11.2016, 21:54  [ТС]
gazlan, вод код полной программы:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
                 FILE *f;
                 FILE *fo;
                 const long long max_size = 2000;         // max length of strings
                 char st1[max_size];
                 wchar_t Word[max_size];
                 char Path[max_size];
                 std::string STR, STR_t;
                 int size_tmp = 0;
                 int a;
                 // узнаем дирректорию с программой
                GetModuleFileNameA(NULL, Path, max_size);
                size_tmp = strlen(Path);
                while(size_tmp > 0  &&  Path[size_tmp - 1] != '\\')
                {
                    Path[--size_tmp] = 0;
                }
                for(unsigned i = 0; i < strlen(Path); i++)
                {
                    STR_t += Path[i];
                }
 
                STR = STR_t;
                // открываем файл для записи результата
                STR += "data\\result.txt";
                //button1->Text = msclr::interop::marshal_as<String^>(STR.c_str());
                fo = fopen(STR.c_str(), "w");
                if (fo == NULL) 
                {
                    this->Text = "Ошибка открытия файла result.txt";
                    fclose(fo);
                    return;
                }
 
 
                STR = STR_t;
                STR += "data\\input.txt";
                f = fopen(STR.c_str(), "r");
                if (f == NULL) 
                {
                    fprintf(fo, "Cannot open input.txt: permission denied\n");
                    fclose(f);
                    fclose(fo);
                    return;
                }
 
 
                while(1)
                {
                    for(a = 0; a < max_size; a++)
                    {
                        Word[a] = 0;
                        st1[a] = 0;
                    }
                    a = 0;
                    while( (st1[a] = fgetc(f)) != EOF ) 
                    {
                        if( (st1[a] == '\n') || (a >= max_size - 1) ) 
                        {
                            st1[a] = 0;
                            break;
                        }
                        a++;
                    }
                    st1[a] = 0;
                        
                    if(!strcmp(st1, "EXIT")) 
                    {
                        break;
                    }
                    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, st1, strlen(st1), Word, strlen(st1));
                    fprintf(fo, "%s - %s\n", (char *)st1, (wchar_t *)Word);
                }
 
                 fclose(f);
                 fclose(fo);
На втором рисунке показано то, что выводится в файл.
А на первом - значения переменных при дебаге. Как видно, что в них изначально кракозябра. Как получить "нормальный" вид строки?
Миниатюры
Функция преобразующая строку из UTF-8 в Windows-1251   Функция преобразующая строку из UTF-8 в Windows-1251  
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.11.2016, 22:16
В два этапа (если вам непременно хочется писать код):
  1. MultiByteToWideChar(CP_UTF8... - Преобразование в Unicode
  2. WideCharToMultiByte(CP_ACP...... - Преобразование в ANSI
Можете просто сконвертировать UTF8 в CP1251 конвертером по ссылке выше.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
13.11.2016, 22:32  [ТС]
Так, похоже что я не так начал.
В общем, к программе подключается модуль, который на вход принимает "нормальный" wchar_t.
Что значит нормальный? Это значит что в нем должны быть слова перед, использованием ... Но никак не такое чудо перед
И как эти два этапа использовать, что бы при дебаге можно было увидеть нормальные(неискаженные слова) в переменной Word?

Можете просто сконвертировать UTF8 в CP1251 конвертером по ссылке выше.
Не могу, так как
Файл находится в кодировке UTF-8 без BOM (в других кодировках быть не может)
Добавлено через 29 секунд
Совсем никак не дойдет.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.11.2016, 22:45
При чем тут BOM?
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
13.11.2016, 22:56  [ТС]
gazlan, what?
Притом, что исходный файл должен находится именно в той кодировке, которую я написал. Не в CP1251, ни в какой либо другой. А в чем заключается тайный смысл вашего сообщения? Никак не пойму. Смотрите скрин.
Миниатюры
Функция преобразующая строку из UTF-8 в Windows-1251  
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.11.2016, 23:14
Цитата Сообщение от Gdasar Посмотреть сообщение
При том, что исходный файл должен находится именно в той кодировке
Мы об одном и том же? Какая разница "в чем" ваш исходный файл, если вам все равно нужен ANSI?

Либо конвертируйте ваш "файл без BOM" предложенным (табличным) конвертером и работайте с 1251 (IMHO, простейший вариант), либо сделайте это же программно через WinAPI в два этапа: UTF8 -> Unicode -> ANSI.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
13.11.2016, 23:19  [ТС]
Так, ладненько.
Про два этапа :
C++
1
2
3
4
5
6
7
8
9
10
11
12
                    while( (st1[a] = fgetc(f)) != EOF ) 
                    {
                        if( (st1[a] == '\n') || (a >= max_size - 1) ) 
                        {
                            st1[a] = 0;
                            break;
                        }
                        a++;
                    }
                    st1[a] = 0;
                    MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, st1, strlen(st1), Word, strlen(st1)); // Word получается пустой
                    WideCharToMultiByte(CP_ACP, MB_PRECOMPOSED, Word, strlen(st1), st1, strlen(st1), NULL, NULL);
Можете поподробней? Спасибо за терпение.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.11.2016, 23:42
Лучший ответ Сообщение было отмечено Gdasar как решение

Решение

utf2txt - полный проект.
Вложения
Тип файла: 7z utf2txt.7z (8.6 Кб, 45 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2016, 23:42
Помогаю со студенческими работами здесь

UTF-8 to WINDOWS-1251
Здравствуйте! Надо вот чего... Есть строка в UTF-8. После перекодировки функцией `UTF8ToString` выползает НЕ-UTF-8. Только хреново...

Перекодировка с windows-1251 в utf-8
как можно написать процедуру на pl/sql, чтобы перекодировал с windows-1251 в utf-8 ?

Перекодирование из windows-1251 в utf-8
есть программа которая берет вордовский файл и конвертирует его в .txt. Но вот на выходе файл в кодировке windows-1251, а мне нужен на...

Парсинг из windows-1251 в UTF-8
Здравствуйте! Существует модуль для DLE который парсит тв программу с tv.mail.ru. Кодировка моего сайта - UTF-8, а программа на...

Декодировать Windows-1251 в utf-8
Сделал запрос на сайт, приходит текст такого типа(должна кириллица) Р’С‹ будете перемещены РЅР° страницу...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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 на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru