Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63

Как можно хранить константную строку из символов кириллицы и работать с ней?

15.02.2015, 01:41. Показов 1295. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Как можно хранить константную строку из символов кириллицы и работать с ней?
C
1
const char msg[] = "фыпафыафы";
strlen выдает огромные цифры, а msg[0], к примеру, выведет какой-то шум. Полагаю это связано с тем, что в стандартный char и киррилица, и латиница не влезут. Соответственно нужно использовать wchar_t, но
C
1
const wchar_t msg[] = L"фыафыаыв";
посимвольный вывод показывает разнообразные читаемые символы, но не кириллицу.


2. Есть файл в формате WINDOWS-1251, состоящий из русских слов, я перевел его, используя iconv в кодировку UTF-8, задача для начала - считать его построчно и вывести на консоль.
Поскольку в utf-8 1 символ может быть закодирован более, чем 1 байтом, я использовал wchar_t тип для хранения полученных данных и соответствующие функции для работы с данным типом, но первый же fgetws выдал ошибку. Вопрос состоит в том, каким образом построчно скопировать файл, изначально в формате WINDOWS-1251 с русскими буквами внутри.

Кстати, оказалось, что file -bi выдает неверную кодировку. Выдает ISO-8859-1, но корректно перекодирование сработало, только если исходную задать как WINDOWS-1251. enca определила кодировку файла правильно.

setlocale(LC_ALL, "RUS"); в обоих случаях не помогло.

Исходники для второго вопроса:

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
    FILE *fd_write;
    FILE *fd_read;
    wchar_t string[40];
    int str_inc = 0;
 
    setlocale(LC_ALL, "RUS");
    memset(string, '\0', sizeof(wchar_t) * 40);
    fd_read = fopen("//home//user//inp.txt", "r");
    if (fd_read == NULL) {
        printf("fopen(read) failed. errno = %d\n", errno);
        return 1;
    }
 
    fd_write = fopen("//home//user//out.txt", "w+");
    if (fd_write == NULL) {
        printf("fopen(write) failed. errno = %d\n", errno);
        return 1;
    }
 
    while ((ret_p = fgetws(string, 40, fd_read)) != NULL) { //error at first iteration
        fputws(string, stdout);
        memset(string, '\0', sizeof(wchar_t) * 40);
    }
 
    if (fclose(fd_read)) {
        printf("close(read) failed. errno = %d\n", errno);
    }
    if (fclose(fd_write)) {
        printf("close(write) failed. errno = %d\n", errno);
    }
Добавлено через 13 минут
При попытке считать файл посимвольно первый же fgetwc() фейлится с errno 84 EILSEQ - The data obtained from the input stream does not form a valid character.
Полагаю, что в fgetws() происходит аналогичная ошибка. Как это можно обойти?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2015, 01:41
Ответы с готовыми решениями:

Как в двумерном массиве, выбрать n строку и работать с ней?
Как в двумерном массиве, выбрать n строку и работать с ней? (умножить, отнять одну строку от другой). Не могу понять логики. Поиск по...

В IBQuery возвращается таблица из БД: можно ли с ней работать как с матрицей?
чтобы как с массивом или с двусвязным списком. ну в общем как обычно. почему возник вопрос - IBQuery.FieldByName возвращает значение...

Как закрыть строку символов, чтобы не было в ней лишнего?
Еще раз всем здравствуйте. Помогите, плз. Пока пытаюсь отладить часть программы где пользователь задает путь и имя файл с которым будем...

3
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
15.02.2015, 01:52
Цитата Сообщение от luck Посмотреть сообщение
setlocale(LC_ALL, "RUS"); в обоих случаях не помогло.
Попробуйте
C
1
setlocale(LC_ALL, "ru_RU.UTF-8");
1
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
15.02.2015, 03:02  [ТС]
easybudda, спасибо, это помогло по второму вопросу.


Хранить и выводить я также научился, но почему то wcslen(string), где const wchar_t string = L"афыафы"; выдает совершенно фантастические цифры.

Добавлено через 6 минут
Тему можно закрывать, похоже, что все ошибки я допустил из-за отсутствия опыта работы с типом wchar_t
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.02.2015, 10:44
Чтобы компилятор правильно построил секцию с данными для конструкций типа:

C
1
const wchar_t msg[] = L"фыафыаыв";
он должен знать как минимум две вещи: в какой кодировке написан исходник и в какой кодировке будет исполняться бинарник. Только зная эти две вещи компилятор сможет правильно закодировать последовательность байтов в секции данных. У gcc это настраивается опциями -finput-charset= и -fexec-charset= (описание https://gcc.gnu.org/onlinedocs/cpp/Invocation.html)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2015, 10:44
Помогаю со студенческими работами здесь

Как уместить текст в одну строку независимо от ширины символов в ней
Добрый день! Уважаемы форумчане, просьба помочь в решении следующей задачи. Я написал макрос, который вставляет строку в шаблон word....

можно ли создать переменную Session из страницы .aspx, чтобы с ней можно было работать в .asp ?
можно ли создать переменную Session из страницы .aspx, чтобы с ней можно было работать в .asp ?

Как загрузить свою базу 1С Предприятия в интернет, чтобы можно было с любого ПК зайти на сайт и работать с ней?
Ребят, всем привет! Вопрос, как мне загрузить свою базу 1С Предприятия в инет, чтобы можно было с любого ПК зайти на сайт и работать с...

Что оптимальнее: хранить картинку в БД или хранить в базе только путь к ней?
Доброго времени суток. Сайт посвящен игровой тематике. На сайте есть раздел в котором используются .gif анимации для демонстрации...

Вставьте вторую строку в первую, начиная с пятой позиции.Распечатайте новую строку и подсчитайте сколько в ней символов
Всем доброго времени суток. Помогите,пожалуйста,с программами: 1)Даны матрицы А(5,3) и С(5,4),каждая из них содержит два одинаковых...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru