3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149

Linux кириллица в файлах

26.08.2020, 01:14. Показов 9937. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте
вопрос: как работать с файлами в линукс, если в них присутствует кириллица?
если открываю используя fstream и считываю getline то на месте кириллических символов символы с отрицательными кодами
если открываю используя wfstream и считываю также getline, то на месте первого кириллического символа завершающий символ '\0'
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2020, 01:14
Ответы с готовыми решениями:

Подсчитать количество вхождений буквы (кириллица) в строку (кириллица)
Суть такая: по требованию программы ввести строку символов (обыкновенный текст, кириллица(!!!)) и посчитать количество вхождений, если...

Qt 5 и кириллица в .ini файлах
Привет, есть к примеру такой .ini файл: EXIT=Выход Читаю .ini файл так: QString...

Кириллица в файлах
Работал с файламив в рhp - возникли проблемы с русской кодировкой - пусть дан некий файл - somefile.txt - в кодировке utf-8 без bom,...

24
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,456
27.08.2020, 22:59
Студворк — интернет-сервис помощи студентам
Если нужно обрабатывать строку, то удобнее переводить в wchar_t. Я не знаю, как это сделать правильно. Могу предложить три варианта:

1. Использовать функции mbsinit, mbsrtowcs (с предварительным вызовом setlocale).
2. Использовать какую-нибудь библиотеку (например, iconv) для перевода кодировки из UTF-8 в UTF-32 (которая используется для wchar_t в Linux).
3. Написать свою функцию для перевода кодировки.
0
 Аватар для COKPOWEHEU
4087 / 2685 / 432
Регистрация: 09.09.2017
Сообщений: 11,939
28.08.2020, 08:51
Humanoid, если речь именно о работе с wchar_t (кстати, под windows это ущербный utf-16, который объединяет недостатки и utf-8 и utf-32, так что там от него преимуществ практически нет), то логично либо mbstowcs если исходная строка в utf-8, либо сразу читать в wchar_t при помощи специальных функций вроде fgetws, аналогов для scanf и printf (формат "ls" либо "%S").
2. iconv скорее для работы с устаревшими кодировками вроде cp1251, 866, koi8-r и т.д. Если писать свою программу, скорее всего можно будет без этого обойтись.
3. А вот это придется делать если нужна совсем жесткая обработка вроде сортировки (в разных локалях разные правила), перевода в верхний-нижний регистры (там соответствие не взаимооднозначное). Ну и диактрические символы, куда ж без них. В обычных кодировках вроде тех же utf-8, utf-32 хранится отдельно символ, отдельно все эти черточки и точки сверху и снизу. То есть для совсем правильной обработки их надо как-то к символу привязать.
0
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149
30.08.2020, 00:28  [ТС]
Еще раз поясню.
Для примера есть файл, его содержимое это одна строка "one два three". Если я его считываю так:
C++
1
2
3
4
5
6
7
int main() {
    fstream fin ("/home/user/test.txt",ios::in);
    char a1[100];
    fin.getline(a1,100);
    fin.close();
    return 0;
}
То при дебаге в массиве я наблюдаю вот что:

a1[0] = {char} 111 'o'
a1[1] = {char} 110 'n'
a1[2] = {char} 101 'e'
a1[3] = {char} 32 ' '
a1[4] = {char} -48 '\320'
a1[5] = {char} -76 '\264'
a1[6] = {char} -48 '\320'
a1[7] = {char} -78 '\262'
a1[8] = {char} -48 '\320'
a1[9] = {char} -80 '\260'
a1[10] = {char} 32 ' '
a1[11] = {char} 116 't'
a1[12] = {char} 104 'h'
a1[13] = {char} 114 'r'
a1[14] = {char} 101 'e'
a1[15] = {char} 101 'e'
a1[16] = {char} 0 '\000'

Например, если:
C++
1
wchar_t b1[]=L"one два three";
Я наблюдаю:

b1[0] = {wchar_t} 111 L'o'
b1[1] = {wchar_t} 110 L'n'
b1[2] = {wchar_t} 101 L'e'
b1[3] = {wchar_t} 32 L' '
b1[4] = {wchar_t} 1076 L'д'
b1[5] = {wchar_t} 1074 L'в'
b1[6] = {wchar_t} 1072 L'а'
b1[7] = {wchar_t} 32 L' '
b1[8] = {wchar_t} 116 L't'
b1[9] = {wchar_t} 104 L'h'
b1[10] = {wchar_t} 114 L'r'
b1[11] = {wchar_t} 101 L'e'
b1[12] = {wchar_t} 101 L'e'
b1[13] = {wchar_t} 0 L'\000'

Вот это я и хотел бы наблюдать, открыв файл и считав из него строку.

Попытка использовать mbsrtowcs к успеху не приводит:
C++
1
2
3
4
5
6
7
8
9
10
int main() {
    setlocale(LC_ALL,"Russian");
    fstream fin ("/home/user/test.txt",ios::in);
    char a1[100];
    wchar_t b1[100];
    fin.getline(a1,100);
    fin.close();
    mbstowcs(b1,a1,100);
    return 0;
}
Результат:

b1[0] = {wchar_t} 111 L'o'
b1[1] = {wchar_t} 110 L'n'
b1[2] = {wchar_t} 101 L'e'
b1[3] = {wchar_t} 32 L' '
b1[4] = {wchar_t} -46891148 L'\xfd347f74'
b1[5] = {wchar_t} 32712 L'翈'
b1[6] = {wchar_t} 1 L'\001'
b1[7] = {wchar_t} 32764 L'翼'
b1[8] = {wchar_t} -1 L'\xffffffff'
b1[9] = {wchar_t} 0 L'\000'
b1[10] = {wchar_t} -46591609 L'\xfd391187'
b1[11] = {wchar_t} 32712 L'翈'
b1[12] = {wchar_t} -48685248 L'\xfd191f40'
b1[13] = {wchar_t} 32712 L'翈'
0
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,456
30.08.2020, 01:12
Цитата Сообщение от Fatinho Посмотреть сообщение
setlocale(LC_ALL,"Russian");
C
1
setlocale(LC_ALL, "ru_RU.UTF-8");
0
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149
30.08.2020, 10:21  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
1
setlocale(LC_ALL, "ru_RU.UTF-8");
спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2020, 10:21
Помогаю со студенческими работами здесь

Кириллица в bat-файлах
Помогите, пожалуйста: имеется батник следующего вида: net user Администратор /active:yes как сделать, чтобы корректно работала...

Кириллица в Linux
Всем привет. Пишу по учебе сетевое приложение на Linux, что-то типо эхо-сервера с прослушиванием сокетов. Проблема такая - что делать с...

Есть 2 файла. В файлах числа, найти самое большое число в обоих файлах
С++ Есть два файла В обоих файлах записаны слова Найти самое большое число в обоих файлах

Какая СУБД хранит данные в файлах с расширением .dat и индексы в файлах .k01, k02 и т.д.?
Какая СУБД хранит данные в файлах с расширением .dat и индексы в файлах .k01, k02 и т.д.? Есть ли возможность подключить эти таблицы в MS...

[Mono] Подскажите ide c# под linux чтобы компилировался файл для linux
Подскажите ide c# под linux чтобы компилировался файл для linux не как в monodevelop


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

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

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru