Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
30 / 23 / 13
Регистрация: 26.10.2013
Сообщений: 125

Работа с файлами в кодировке UTF-16 LE (1200)

07.03.2016, 21:24. Показов 4393. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!

У меня возникла проблема при обработке файлов в кодировке UTF-16 LE (1200): нужно заменить в них одну строчку. Алгоритм такой:

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
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
 
int main(int argc, char* argv[])
{
std::string line;
ifstream read("data.txt");
// Открытие файла для чтения;
ofstream write("temp.txt");
// Создание временного файла;
 
while (getline(read, line)) {
 
if (line.find("<Disabled>") != std::string::npos) line = "<Enabled>";
write << line << endl;
 
}
 
read.close();
write.close();
 
MoveFileEx("temp.txt", "data.txt", MOVEFILE_REPLACE_EXISTING);
// Замена модифицированным файлом;
 
return 0;
}
Помогите, пожалуйста, учесть кодировку, а то никак не могу сообразить Используется среда VC 6.0.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2016, 21:24
Ответы с готовыми решениями:

fstream работа с utf-8 файлами
Открывается файл в кодировке utf-8: fstream fin; fin.open(fOpenDlg.GetPathName(),ios::in); char buffer; fin.read(buffer,5000); ...

Ошибка при кодировке в UTF-8
Вот, написал код. Здесь его часть в начале файла указана кодировка UTF-8, перед строкой поставил &quot;u&quot;, но всё равно когда в Visual...

соханение в бокнот в кодировке UTF-8
if SaveTextFileDialog1.Execute then Memo1.Text := AnsiToUtf8(Memo1.Text); Memo1.Lines.SaveToFile(SaveTextFileDialog1.FileName); ...

4
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
08.03.2016, 10:02
Наверное надо вместо std::string взять std::wstring.
0
30 / 23 / 13
Регистрация: 26.10.2013
Сообщений: 125
08.03.2016, 10:35  [ТС]
rao, уже пробовал, но решил проверить ещё раз, изменив код таким образом:

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
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
 
int main(int argc, char* argv[])
{
std::wstring line;
wifstream read("data.txt");
// Открытие файла для чтения;
wofstream write("temp.txt");
// Создание временного файла;
 
while (getline(read, line)) {
 
if (line.find(L"<Disabled>") != std::wstring::npos) line = L"<Enabled>";
write << line << endl;
 
}
 
read.close();
write.close();
 
MoveFileEx("temp.txt", "data.txt", MOVEFILE_REPLACE_EXISTING);
// Замена модифицированным файлом;
 
return 0;
}
В результате не работает замена строки, так как программа не находит соответствий из-за проблемы с кодировкой, а конечный файл после обработки представляет собой (если смотреть в кодировке 1251) первую строчку в виде "яю<", а остальные заменяются на обычный перенос строки (становятся абсолютно пустыми). Если же открыть выходной файл в его "родной" кодировке, то можно увидеть нечто подобное: "഼ഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊഊ ഊഊ". Как я понял, каждый такой символ соответствует одной строке исходного файла, хотя все строки в нём разные, а символы получаются одинаковые.

Добавлено через 7 минут
P. S. Установка флагов std::ios::binary тоже не помогла.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
09.03.2016, 20:23
Лучший ответ Сообщение было отмечено Bruce_Wayne как решение

Решение

У меня строчки стали читаться, если написать такое заклятье:
C++
1
2
3
4
5
6
    #include <codecvt>
    ...
    wifstream read("data.txt"); // Открытие файла для чтения;
    read.imbue(std::locale(read.getloc(),
        new std::codecvt_utf16<wchar_t, 1114111UL, std::little_endian>));
    ...
Но работает это только в Visual Studio 10 и выше.
1
30 / 23 / 13
Регистрация: 26.10.2013
Сообщений: 125
12.03.2016, 22:11  [ТС]
Прошу прощения за долгое отсутствие: не было возможности проверить в другой среде (сейчас пробую работать в VS 2015). Получилось следующее... Вывод в консоли действительно стал читаемым, но сравнение по-прежнему не работает, а вывод в файл почему-от идёт в читаемом виде ровно через строчку То есть, например, первая строчка - "<?xml version="1.0" encoding="UTF-16"?>", вторая - "਍    㰀䔀渀愀戀氀攀搀㸀琀爀甀攀㰀⼀䔀渀愀戀氀攀搀㸀ഀഀ" и т. д.

Добавлено через 28 минут
P. S. Удалось решить задачку со странным выводом читаемого текста путём использования флагов std::ios::binary, которые не помогли в прошлый раз. Остаётся проблема сравнения...

Добавлено через 23 часа 2 минуты
Всё получилось! Пришлось использовать посимвольные сравнение/запись, обращаясь к считанной строке, как к массиву, так как каждый символ разделён пробелом, а в конце каждой строки есть завершающий нуль-символ. Что странно, попытка искать строку с учётом этих самых пробелов не увенчалась успехом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2016, 22:11
Помогаю со студенческими работами здесь

Создание файла в UTF-8 кодировке
Здравствуйте! Как сделать что бы в данной ситуации файл создавался в utf-8 DWORD tmp0; TCHAR buffer; bool test; ...

Считывание txt в кодировке utf-8
Возникла проблема при считывании текстовых файлов в кодировке utf-8. Вернее, считывать-то считывает, однако почему-то дальше программа...

Записать в блокнот в кодировке UTF-8
Здравствуйте, как записывать и считывать строки в кодировке UTF-8 ?

Не сохраняется файл в кодировке utf-8 without bom
Мне нужно сохранить файл в кодировке UTF-8 без BOM. Для этого пробовал два способа - //FastColoredTextBox fctbMain.SaveToFile(file,...

Как хранить строки в кодировке UTF-8?
Как сделать, чтобы в строковом типе символы находились в кодировке utf8? в данном коде слово ТЕКСТ будет в 1251. string строка =...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru