Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
1

Почему Linux понимает русский язык, и как разучить его это делать?

27.12.2014, 20:31. Показов 1188. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Зная, что в Linux принята неравномерная кодировка UTF-8, я удивлялся, как считай однобайтовый тип char позволяет обрабатывать русские буквы. Экспериментируя, я пришёл к выводу, что двухбайтовые символы считываются в отдельные два char, а потом, когда передаём данные консоли, она распознаёт инояз и обрабатывает соответствующе.

В связи с этим, возникает следующие связанные вопросы:
1) Прав ли я?
2) Как тогда обрабатывать не-ascii символы? Использовать сторонние библиотеки? С wchar_t вопрос ниже:
3) Почему при банальной замене ifstream на wifstream, char на wchat_t в нижеприведённой программе вызывает внезапное нежелание что-либо отображать у консоли?
4) UTF8 - неравномерный код. Т. е. один символ может и тремя, и более байтами шифроваться. Что делать? wchat_t не помогает.
5) А если я хочу выводить всякие ascii символы из второй половины таблицы, как сделать так, чтобы консоль не спутала их со спецбайтами UTF-8? imbue(std::locale("C")) не помогает.

Программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
 
int main()
{
    std::string fileName;
    std::cin >> fileName;
    std::ifstream in(fileName.c_str());
 
    char c;
    while(in.get(c))
        std::cout << c;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2014, 20:31
Ответы с готовыми решениями:

Почему у меня язык английский? Я ведь при установке ставил русский, и как его поменять?
Всем привет. Решил подучить jooml'у. Скачал видео уроки, делал все как сказано: скачал, залил на...

QRegularExpression не понимает русский язык
Имеется код QRegularExpression en(&quot;(*)&quot;); QRegularExpression ru(&quot;(*)&quot;); ...

Запрос не понимает русский язык
Имеется код private void namemater_SelectedIndexChanged(object sender, EventArgs e) { ...

Сайт не понимает Русский язык
Доброго вечера. Может кто подсказать почему сайт не понимает русский язык, скачать с инета шаблон ...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
13
6959 / 6007 / 2728
Регистрация: 14.04.2014
Сообщений: 25,689
27.12.2014, 20:56 2
В чём вопрос-то? Как получить отдельный символ?
0
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
27.12.2014, 21:00  [ТС] 3
Ну, да, выделение, а также вопросы хранения и работы с выходными данными и проч.
0
6959 / 6007 / 2728
Регистрация: 14.04.2014
Сообщений: 25,689
27.12.2014, 21:03 4
Считываешь строку, перекодируешь в wchar_t, чтобы можно было индексировать, и выводишь, если надо, в wcout.
0
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
27.12.2014, 21:08  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
 
int main()
{
    std::string fileName;
    std::cin >> fileName;
 
    std::wifstream in(fileName.c_str());
 
    wchar_t c;
    unsigned count = 0;
    
    while(in.get(c))
    {
        count++;
        std::wcout << c;
    }
 
    std::cout << count << "\n";
}
Спасибо за идею, но тоже не работает. Показывает количество считанных символов - 0.
0
6959 / 6007 / 2728
Регистрация: 14.04.2014
Сообщений: 25,689
27.12.2014, 21:12 6
Файл у тебя в какой кодировке?
0
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
27.12.2014, 21:13  [ТС] 7
UTF-8, linux/unix line ending.
0
6959 / 6007 / 2728
Регистрация: 14.04.2014
Сообщений: 25,689
27.12.2014, 21:25 8
Я про файл, который открываешь. Если utf8, то читай обычным ifstream в обычный char[], только не по одному символу, а строками. И каждую строку char перекодируй в строку wchar_t. Вот здесь пример: http://en.cppreference.com/w/c... e/mbstowcs
А уже после работаешь со строкой.
1
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
27.12.2014, 21:31  [ТС] 9
Спасибо, только

только не по одному символу, а строками.
Собственно, а разница?

И если, скажем, я хочу сделать программу понятной для китайцев, т. е. даже в wchar_t код символа уже не будет умещаться, то что тогда делать?
0
14119 / 7580 / 1802
Регистрация: 30.01.2014
Сообщений: 12,683
28.12.2014, 00:01 10
relationer, лучше озвучь задачу свою целиком. Зачем тебе понадобилось работать с отдельными символами?
0
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
28.12.2014, 02:46  [ТС] 11
Ну, необходимо считывать из файла и выводить на экран. В файл можно писать на каком угодно языке. Вообще, просто интересно. Я так понимаю, в итоге, что можно довольствоваться этими возможностями, а если надо большее, то нужно искать отдельные инструменты?
0
6959 / 6007 / 2728
Регистрация: 14.04.2014
Сообщений: 25,689
28.12.2014, 06:27 12
Цитата Сообщение от relationer Посмотреть сообщение
Собственно, а разница?
get() будет читать просто байты.

Почему wchar_t не хватит для китайцев? В Windows же хватает.
0
Evg
Эксперт CАвтор FAQ
21159 / 8175 / 628
Регистрация: 30.03.2009
Сообщений: 22,473
Записей в блоге: 30
28.12.2014, 09:43 13
Лучший ответ Сообщение было отмечено relationer как решение

Решение

Цитата Сообщение от relationer Посмотреть сообщение
И если, скажем, я хочу сделать программу понятной для китайцев, т. е. даже в wchar_t код символа уже не будет умещаться, то что тогда делать?
По смыслу unicod реализован так, чтобы туда влезало всё, что есть на свете. Линуксовая реализация wchar'а именно такая, в отличие от виндовой. Если хочешь работать с wchar'ом, то ВСЕ интерфейсы надо использовать wchar'овские: wcin, wstring, wcout, wifstream, wofstream, wchar_t (ну и конечно же интерфейсы настройки кодировки) и не перемешивать их с обычными char'овскими. А ещё помнить народную мудрость: правильно поставленный вопрос - это уже половина ответа

На всякий случай:
Сложности понимания работы utf-8 и ascii
http://zelserg.livejournal.com/2117.html
http://zelserg.livejournal.com/2570.html

Цитата Сообщение от relationer Посмотреть сообщение
Я так понимаю, в итоге, что можно довольствоваться этими возможностями, а если надо большее, то нужно искать отдельные инструменты?
Все инструменты уже есть, нужно только понимать, как они работают. А для этого нужно понимать матчасть того, как устроены кодировки. Без понимая этого так и будешь решать свои задачи методом тыка и при помощи форума
1
14119 / 7580 / 1802
Регистрация: 30.01.2014
Сообщений: 12,683
28.12.2014, 14:56 14
Цитата Сообщение от relationer Посмотреть сообщение
Ну, необходимо считывать из файла и выводить на экран.
Ну вот я к этому и клоню, что для этой задачи не нужна возможность получать символ именно как сущность, в виде отдельной переменной. Такая возможность нужна очень редко на самом деле. Но если она все-таки понадобится, то вот ссылка для небольшую легковесную библиотеку для упрощения работы с utf-8.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2014, 14:56

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Не понимает русский язык и символы
Доброго времени суток! Есть небольшая программулина, которая отправляет на сайт данные, там эти...

PHP не понимает русский язык
Видел много сообщений на эту тему, но что-то они мне не помогли. Я использую Open Server с...

PureBasic не понимает русский язык из консоли
Доброго времени суток. Решил через консоль узнать содержание папки, записываю в файл, но PureBasic...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.