33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
|
||||||
1 | ||||||
Почему Linux понимает русский язык, и как разучить его это делать?27.12.2014, 20:31. Показов 1555. Ответов 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")) не помогает. Программа:
0
|
|
27.12.2014, 20:31 | |
Ответы с готовыми решениями:
13
Почему у меня язык английский? Я ведь при установке ставил русский, и как его поменять? QRegularExpression не понимает русский язык
|
7533 / 6396 / 2916
Регистрация: 14.04.2014
Сообщений: 27,855
|
|
27.12.2014, 20:56 | 2 |
В чём вопрос-то? Как получить отдельный символ?
0
|
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
|
|
27.12.2014, 21:00 [ТС] | 3 |
Ну, да, выделение, а также вопросы хранения и работы с выходными данными и проч.
0
|
7533 / 6396 / 2916
Регистрация: 14.04.2014
Сообщений: 27,855
|
|
27.12.2014, 21:03 | 4 |
Считываешь строку, перекодируешь в wchar_t, чтобы можно было индексировать, и выводишь, если надо, в wcout.
0
|
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
|
||||||
27.12.2014, 21:08 [ТС] | 5 | |||||
0
|
7533 / 6396 / 2916
Регистрация: 14.04.2014
Сообщений: 27,855
|
|
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
|
7533 / 6396 / 2916
Регистрация: 14.04.2014
Сообщений: 27,855
|
|
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
|
17415 / 9249 / 2262
Регистрация: 30.01.2014
Сообщений: 16,196
|
|
28.12.2014, 00:01 | 10 |
relationer, лучше озвучь задачу свою целиком. Зачем тебе понадобилось работать с отдельными символами?
0
|
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
|
|
28.12.2014, 02:46 [ТС] | 11 |
Ну, необходимо считывать из файла и выводить на экран. В файл можно писать на каком угодно языке. Вообще, просто интересно. Я так понимаю, в итоге, что можно довольствоваться этими возможностями, а если надо большее, то нужно искать отдельные инструменты?
0
|
7533 / 6396 / 2916
Регистрация: 14.04.2014
Сообщений: 27,855
|
|
28.12.2014, 06:27 | 12 |
get() будет читать просто байты.
Почему wchar_t не хватит для китайцев? В Windows же хватает.
0
|
![]() ![]() |
|
28.12.2014, 09:43 | 13 |
![]() Решение
По смыслу 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 Все инструменты уже есть, нужно только понимать, как они работают. А для этого нужно понимать матчасть того, как устроены кодировки. Без понимая этого так и будешь решать свои задачи методом тыка и при помощи форума
1
|
17415 / 9249 / 2262
Регистрация: 30.01.2014
Сообщений: 16,196
|
|
28.12.2014, 14:56 | 14 |
Ну вот я к этому и клоню, что для этой задачи не нужна возможность получать символ именно как сущность, в виде отдельной переменной. Такая возможность нужна очень редко на самом деле. Но если она все-таки понадобится, то вот ссылка для небольшую легковесную библиотеку для упрощения работы с utf-8.
0
|
28.12.2014, 14:56 | |
Помогаю со студенческими работами здесь
14
PHP не понимает русский язык
Пытаюсь опрашивать сайт. Не понимает русский язык Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |