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

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

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

1. Использовать функции mbsinit, mbsrtowcs (с предварительным вызовом setlocale).
2. Использовать какую-нибудь библиотеку (например, iconv) для перевода кодировки из UTF-8 в UTF-32 (которая используется для wchar_t в Linux).
3. Написать свою функцию для перевода кодировки.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
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
11556 / 4351 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru