Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149

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

26.08.2020, 01:14. Показов 10125. Ответов 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
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,458
27.08.2020, 22:59
Студворк — интернет-сервис помощи студентам
Если нужно обрабатывать строку, то удобнее переводить в wchar_t. Я не знаю, как это сделать правильно. Могу предложить три варианта:

1. Использовать функции mbsinit, mbsrtowcs (с предварительным вызовом setlocale).
2. Использовать какую-нибудь библиотеку (например, iconv) для перевода кодировки из UTF-8 в UTF-32 (которая используется для wchar_t в Linux).
3. Написать свою функцию для перевода кодировки.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
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
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,458
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
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru