Меню

Как настроить язык в консоли

Русский язык в консоли

Учу C++ по книжке Страуструпа, не выводятся русские символы. Вот код:

«Повторяющееся слово: » — отображается нормально благодаря setlocale. То что после — крякозяблы, хотя повторяющееся слова находит. setlocale пробовал разные (0, «»), «», «Rus» и пр.

В Code::Blocks всё работает и без крякозяблов. Даже без setlocale.

5 ответов 5

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

Правильное, но сложное решение

Для начала, проблема у консоли Windows состоит в том, что её шрифты, которые стоят «по умолчанию», показывают не все символы. Вам следует сменить шрифт консоли на юникодный, это позволит работать даже на английской Windows. Если вы хотите поменять шрифт только для вашей программы, в её консоли нажмите на иконку в левом верхнем углу → Свойства → Шрифт. Если хотите поменять для всех будущих программ, то же самое, только заходите в Умолчания, а не Свойства.

Lucida Console и Consolas справляются со всем, кроме иероглифов. Если ваши консольные шрифты позволят, вы сможете вывести и 猫 , если нет, то лишь те символы, которые поддерживаются.

Дальнейшее рассмотрение касается лишь Microsoft Visual Studio. Если у вас другой компилятор, пользуйтесь предложенными на свой страх и риск, никакой гарантии нету.

Теперь, кодировка входных файлов компилятора. Компилятор Microsoft Visual Studio (по крайней мере, версии 2012 и 2013) компилирует исходники в однобайтных кодировках так, как будто бы они на самом деле в ANSI-кодировке, то есть для случая русской системы — CP1251. Это означает, что кодировка исходников в CP866 — неправильна. (Это важно, если вы используете L». » -строки.) С другой стороны, если вы храните исходники в CP1251, то эти же исходники не будут нормально собираться на нерусской Windows. Поэтому стоит хранить исходники в Unicode (например, UTF-8).

Настроив среду, перейдём к решению собственно задачи.

Правильным решением является уйти от однобайтных кодировок, и использовать Unicode в программе. При этом вы получите правильный вывод не только кириллицы, но и поддержку всех языков (изображение отсутствующих в шрифтах символов будет отсутствовать, но вы сможете с ними работать). Для Windows это означает переход с узких строк ( char* , std::string ) на широкие ( wchar_t* , std::wstring ), и использование кодировки UTF-16 для строк.

(Ещё одна проблема, которую решает использование широких строк: узкие строки при компиляции кодируются в однобайтную кодировку используя текущую системную кодовую страницу, то есть, ANSI-кодировку. Если вы компилируете вашу программу на английской Windows, это приведёт к очевидным проблемам.)

Вам нужно _setmode(_fileno(. ), _O_U16TEXT); для переключения режима консоли:

Такой способ должен работать правильно с вводом и выводом, с именами файлов и перенаправлением потоков.

Важное замечание: потоки ввода-вывода находятся либо в «широком», либо в «узком» состоянии — то есть, в них выводится либо только char* , либо только wchar_t* . После первого вывода переключение не всегда возможно. Поэтому такой код:

вполне может не сработать. Используйте только wprintf / wcout .

Если очень не хочется переходить на Unicode, и использовать однобайтную кодировку, будут возникать проблемы. Для начала, символы, не входящие в выбранную кодировку (например, для случая CP1251 — базовый английский и кириллица), работать не будут, вместо них будет вводиться и выводиться абракадабра. Кроме того, узкие строковые константы имеют ANSI-кодировку, а это значит, что кириллические строковые литералы на нерусской системе не сработают (в них будет зависимая от системной локали абракадабра). Держа в голове эти проблемы, переходим к изложению следующей серии решений.

Менее правильные, но пригодные решения

В любом случае, поставьте юникодный шрифт в консоли. (Это первый абзац «сложного» решения.)

Убедитесь, что ваши исходники в кодировке CP 1251 (это не само собой разумеется, особенно если у вас не русская локаль Windows). Если при добавлении русских букв и сохранении Visual Studio ругается на то, что не может сохранить символы в нужной кодировке, выбирайте CP 1251.

(1) Если компьютер ваш, вы можете поменять кодовую страницу консольных программ на вашей системе. Для этого сделайте вот что:

  1. Запустите Regedit.
  2. На всякий пожарный экспортируйте куда-нибудь реестр (этот шаг все почему-то пропускают, так что когда всё сломается, мы вас предупреждали).
  3. В разделе HKEY_CURRENT_USER\Console найдите ключ CodePage (если нету, создайте ключ с таким названием и типом DWORD ).
  4. Установите значение по ключу (левая клавиша/изменить/Система счисления = десятичная) на 1251.
  5. Не забудьте перегрузиться после изменений в реестре.

Преимущества способа: примеры из книг начнут работать «из коробки». Недостатки: смена реестра может повлечь за собой проблемы, кодировка консоли меняется глобально и перманентно — это может повлиять сломать другие программы. Плюс эффект будет только на вашем компьютере (и на других, у которых та же кодировка консоли). Плюс общие проблемы неюникодных способов.

Примечание. Установка глобальной кодовой страницы консоли через параметр реестра HKEY_CURRENT_USER\Console\CodePage не работает в Windows 10, вместо него будет использована кодовая страница OEM — предположительно баг в conhost. При этом установка кодовой страницы консоли на уровне конкретного приложения ( HKEY_CURRENT_USER\Console\(путь к приложению)\CodePage ) работает.

(2) Вы можете поменять кодировку только вашей программы. Для этого нужно сменить кодировку консоли программным путём. Из вежливости к другим программам не забудьте потом вернуть кодировку на место!

Это делается либо при помощи вызова функций

в начале программы, либо про помощи вызова внешней утилиты

Читайте также:  Как настроить микро в чат рулетке с компа

(То есть, у вас должно получиться что-то вроде

и дальше обыкновенный код программы.)

Можно обернуть эти вызовы в класс, чтобы воспользоваться плюшками автоматического управления временем жизни объектов C++.

(если выполняете задание из Страуструпа можно вставить в конец заголовочного файла std_lib_facilities.h )

Если вам нужен не русский, а какой нибудь другой язык, просто замените 1251 на идентификатор нужной кодировки (список указан ниже в файле), но, разумеется, работоспособность не гарантируется.

Остались методы, которые тоже часто встречаются, приведём их для полноты.

Методы, которые работают плохо (но могут помочь вам)

Метод, который часто рекомендуют — использование конструкции setlocale(LC_ALL, «Russian»); У этого варианта (по крайней мере в Visual Studio 2012) гора проблем. Во-первых, проблема с вводом русского текста: введённый текст передаётся в программу неправильно! Нерусский текст (например, греческий) при этом вовсе не вводится с консоли. Ну и общие для всех неюникодных решений проблемы.

Ещё один метод, не использующий Unicode — использование функций CharToOem и OemToChar . Этот метод требует перекодировки каждой из строк при выводе, и (кажется) слабо поддаётся автоматизации. Он также страдает от общих для неюникодных решений недостатков. Кроме того, этот метод не будет работать (не только с константами, но и с runtime-строками!) на нерусской Windows, т. к. там OEM-кодировка не будет совпадать с CP866. В дополнение можно так же сказать что эти функции поставляются не со всеми версиями Visual Studio — например в некоторых версиях VS Express их просто нет.

Поэтому стоит хранить исходники в Unicode (например, UTF-8).

Причем сохранить следует с сигнатурой

Ситуацию частично спасает пересохранение исходников в кодировке UTF-8 с обязательным символом BOM, без него Visual Studio начинает интерпретировать «широкие» строки с кириллицей весьма своеобразно. Однако, указав BOM (Byte Order Mark — метка порядка байтов) кодировки UTF-8 — символ, кодируемый тремя байтами 0xEF, 0xBB и 0xBF, мы получаем узнавание кодировки UTF-8 в любой системе

Стоит пояснить кое-что для тех, кто ищет правильный ответ по поводу функции setlocale:

Метод, который часто рекомендуют — использование конструкции setlocale(LC_ALL, «Russian»); У этого варианта (по крайней мере в Visual Studio 2012) гора проблем. Во-первых, проблема с вводом русского текста: введённый текст передаётся в программу неправильно! Нерусский текст (например, греческий) при этом вовсе не вводится с консоли. Ну и общие для всех неюникодных решений проблемы.

Я добавлю по этому методу побольше информации: Его вообще не правильно рекомендуют!

Начнём с первого: Во втором параметре функция принимает не название страны или языка, хотя в некоторых случаях она сработает, а языковый идентификатор, согласно ISO 3166-1. Поэтому правильно и корректно указывать: «ru-RU». Теперь второе: в документации к этой функции написано чёрным по белому: «If execution is allowed to continue, the function sets errno to EINVAL and returns NULL.» Что буквально толкуется: при возникновении ошибки, функция устанавливает значение переменной errno в EINVAL и возвращает NULL.

В случае возникновения ошибки, errno всегда будет равен EINVAL, что означает: не верный аргумент. Поэтому её проверять нет смысла, а вот исполнение функции должно быть проверено. Поэтому правильный вызов функции setlocale выглядит следующим образом:

И не забывайте, что setlocale устанавливает локальную таблицу только для ANSI кодировки, поэтому и не будут отображаться греческие, испанские, китайские и даже японские знаки. Для русского языка это будет таблица номер 1251.

И важно: почему эта функция является надёжней, нежели прямая установка таблицы символов через SetConsoleCP, ибо потому, что она переключает все внутренние надстройки именно для раскладки под язык. Начиная от стандарта отображения даты, заканчивая знаками разделителя.

И да, не стоит устанавливать языковый указатель виде «ru», так как в зависимости от сборки самой ось и имеющихся языковых пакетов, может установиться ru-BY, ru-UA, ru-MO и другие языковые стандарты, значительно отличающиеся от ru-RU. И категорично нельзя указывать «Russia», «Russian», «Russian Federation» (да, такую вакханалию уже встречал пару раз). Хотя функция производит проверку и по названию региона, не всегда в таблице локализации это указано, или может быть указано «Россия» или «Русский» уже на нашей раскладке. Это и есть основная ошибка, из-за которой функция setlocale зачастую отказывается работать.

И да, для приложения, работающего в режиме юникогда, стоит использовать функцию _wsetlocale. Она идентична, и также устанавливает базовые настройки для локализации. Кроме того, если проект приложения в Visual Studio настроен в режим юникода, то и будет работать только _wsetlocale, так как setlocale, по документации, не приспособлена к работе с юникодом вообще никак.

UPD.

Совсем забыл указать, что функция setlocale и _wsetlocale, в случае успеха вернёт именно идентификатор региона. То есть, в нашем случае строку «ru_RU\0».

Источник

Как поменять язык в CS:GO

В КС:ГО имеется функция смены языка. И хотя большинству игроков она ненужна, некоторым может быть интересно, как выглядит локализация игры на остальных языках. Это может понадобиться для изучения новых слов или простого удобства понимания терминов, используемых сообществом, в котором на текущий момент варится игрок. Это главный повод того чтобы узнать как поставить английский язык в КС:ГО.

Как поменять язык в КС:ГО через свойства

Этот вариант применим ко всем играм в Steam, которые имеют локализацию на несколько языков. Понадобится:

  1. Открыть клиент стима.
  2. Перейти в библиотеку.
  3. Кликнуть правой кнопкой мыши по КС:ГО.
  4. Выбрать «Свойства» в появившемся меню.
  5. Открыть вкладку «Язык».
  6. Поставить нужный.
  7. Закрыть окно.

Затем игра начнет автоматически загружать файлы локализации, если это еще не было сделано. Установка может занять несколько минут, затем можно запускать игру и проверять изменение языка. Стоит учесть, что шрифт консоли у некоторых локализаций, включая русскую, значительно ухудшается.

Как поменять язык через параметры запуска

Допустим, поиграв некоторое время на английском или ином языке, можно захотеть вернуться. Как поменять язык в КС:ГО на русский? Для этого есть альтернативный способ, в котором понадобится задействовать параметры запуска. Итак, надо:

  1. Открыть стим.
  2. Войти в библиотеку.
  3. Нажать ПКМ по значку КС:ГО.
  4. Выбрать «Свойства» в отображенном меню.
  5. Открыть «Установить параметры запуска».
  6. В появившуюся строку надо вписать -language russian.
  7. Кликнуть по «ОК».

После этого локализация игры будет возвращена. Остается закрыть все окна и запустить КС:ГО, чтобы убедиться в произведенных изменениях. Параметры запуска — более полезная вещь, чем можно предположить, поскольку с помощью команд можно неплохо улучшить свою эффективность в игре и даже повысить производительность. Также, при помощи именно этого способа, можно получить в игре пасхальный пиратский язык и уйму веселья, с ним связанного.

Как поменять язык в КС:ГО на русский

Чтобы установить русский язык, необходимо в параметры запуска прописать следующую строчку: -language russian. Инструкция по установке параметров запуска чуть выше.

Источник

Поддержка русского языка в консоли

Содержание

В 15.10 изменена система загрузки (sustemd) и описанное ниже средство не помогает. Смотрите раздел Решение для ubuntu 15.10 и более поздних.

Почему в консоли квадратики вместо русских букв?

Многие замечали, что из версии в версию в Ubuntu у некоторых слетают русские фонты в консоли (куда можно попасть нажав CTRL+ALT+F1 — F6, а CTRL+ALT+F7 возвращает в графическую среду). Озаботившись причинами почему это происходит я (Sly_tom_cat) облазил кучу мест в поисках решения. Залез и в initrd и смотрел в скрипты upstart и в UDEV… что ни правил — не помогает. Особо порадовал комментарий разработчиков в одном из скриптов Udev 1) . Cуть там примерно такова: «надо бы делать как-то так, но мы попробовали — у нас не вышло. Так что, делаем как получится, а если юзерам нужны нормальные фонты — пускай выполнят setupcon и все будет Ok»

Но все-таки нет такого решения, которого не найти в Интернете. Причем нашел я его даже по русски 2)

Как же правильно лечить больного?

Оказывается, всего навсего, нужно включить поддержку фреймбуфера на этапе инициализации ядра. Это в свою очередь разрешит выполнение нужных скриптов, которые загрузят фонты на самом раннем этапе инициализации ядра.
Для этого:
1. в любом текстовом редакторе с правами рута нужно в файл /etc/initramfs-tools/initramfs.conf добавить строчку FRAMEBUFFER=Y. Это также можно сделать выполнив следующие команды:

2. Обновить образ рамдиска периода инициализации ядра (initrd):

Поле этих манипуляций наконец начнут работать настройки сделанные командой 3) :

Кириллическими фонтами будет показываться все с самого начала — т.е. даже запрос на проверку дисков (возникающий в процессе инициализации ядра) будет выводится кириллицей, а не квадратами.

Возможно потребуется так же настроить и клавиатуру (раскладки, переключение раскладок и compose-key) 4) :

Кому интересно — «откуда ноги растут».

Покопавшись глубже можно обнаружить следующее:
В initrd/scripts/init-top/ лежат скрипты выполняющиеся в самом начале процесса инициализации ядра. И там мы видим все, что могло бы потребоваться для поддержки «правильных» фонтов

Но, если заглянуть в файлы console_setup, keymap и framebuffer то в самом начале скрипта мы увидим такую строчку:

А покопавшись в скриптах инициализации можно понять, что OPTION обрабатывается так, что если значение переменной (что ей присвоено) не задано или не Y, то выполнение самого скрипта пропускается. Т.е. в нашем случае, если FRAMEBUFFER не равно Y, то ни один из скриптов, отвечающих за поддержку фонтов и раскладок клавиатуры, попросту не будут выполнятся в процессе инициализации ядра.
Но без FRAMEBUFFER не возможно загрузить шрифты с поддержкой национальных символов!
Примечательно то, что настройки раскладок клавиатуры все-таки будут применены в процессе загрузки ОС (уже после инициализации ядра). За это отвечает скрипт console-setup системы инициализации upstart, а вот консольные фонты скрипты upstart не настраивают.

Однако, это совсем не объясняет почему подобная проблема возникает не у всех. И как оказывается — она вылезает у любителей оптимизации системы, да еще и у пользователей серверной версии Ubuntu…

Что можно увидеть в любой инструкции по повышению скорости загрузки ОС?

Правильно — «уберите заставку при загрузке»: в файле /etc/default/grub в переменной GRUB_CMDLINE_LINUX_DEFAULT значение splash замените на nosplash или просто уберите) и выполните sudo update-grub. Ну, а пользователи серверной версии Ubuntu по умолчанию обделены таким «счастьем», как графическая заставка во время загрузки.

Так вот, оказывается, разработчики решили, что фреймбуфер нужен для рисования заставки и … и только для этого. Больше (оказывается) он никому, ни зачем, не нужен. Поэтому, если заставку рисуем — то фреймбуфер разрешаем (а то как же — без него же не нарисовать заставку), а если заставку не рисуем, то и фреймбуфер включать незачем, не включаем…. Нет, позже, после инициализации ядра, фреймбуфер все-таки где-то активируется, но поезд уже ушел — фонты на этапе иницализации ядра не загрузились…. «а кому надо — те пусть вызывают setupcon …»

Решение для ubuntu 15.10 и более поздних

В Ubuntu 15.10 имеется неисправленный баг с настройкой локали https://bugs.launchpad.net/ubuntu/+source/console-setup/+bug/1511975. Поэтому для настройки русского языка необходимо проделать следующее 1.

(настройки в файле /etc/default/console-setup)

(настройки в файле /etc/default/keyboard)

Заменить последнюю строку

Вредные советы

Поиск в сети порой дает много костыльных советов на данную тему. Особенно часто встречаются два из них:
1. костыль из костылей: «Прописать setupcon в /etc/rc.local» — мало того что это костыль, да еще и не помогает иногда 🙁
2. совсем эпический по своей дебильности костыль — персональный пакет для русского языка в консоли — console-cyrillic . …вызывает полное недоумение идея — «под каждый язык на свете создавать персональный пакет для консоли», когда по дефолту в UTF8 кодировке и основных консольных шрифтах есть все, что нужно для поддержки практически любого языка (по крайней мере европейского).

Если вам попадаются такие советы, не поленитесь — объясните людям их глубокое заблуждение и отправьте на эту страницу.

Источник



Как поменять язык в консоли Skyrim

Часто случатся так, что в игре Скайрим невозможно осуществить переключение языка с русского на английский. Такая проблема встречается не во всех версиях игры и пока не удалось определить причину, по которой так происходит. В данной статье мы расскажем, как поменять язык в консоли Skyrim.

Первый способ (проверен на всех версиях игры) поменять язык

1. Зайдите меню Пуск и выберите там Панель управления.

2. Найдите в панели пункт под названием Смена раскладки клавиатуры или других способов ввода и нажмите на него.

3. В появившемся новом окне выберите вкладку Языки клавиатуры, после чего нажмите на кнопку Изменить клавиатуру.

4. Когда вы увидите выпадающее меню, выберите в нем в качестве языка по умолчанию английский, затем выделите русскую клавиатуру и нажмите на кнопку Удалить.

5. Примените произведенные вами изменения.

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

Для того, чтобы вернуть обратно русскую раскладку клавиатуры и переключение языков, проделайте первых три шага, а затем нажмите кнопку Добавить, выберите русский язык и сделайте его языком по умолчанию. Этот способ поможет вам понять, как в Skyrim изменить язык консоли, когда другие способы не помогают. Описанные выше шаги были проделаны в ОС Windows 7, однако в ХР и Vista все делается практически точно также.

Второй способ (только для обладателей лицензионной Steam-версии игры) поменять язык

1. Запустите игру, затем войдите в сообщество Steam, нажав комбинацию клавиш Shift+Tab.

2. Найдите любого друга в списке и войдите в режим обмена сообщениями с ним.

3. Писать ему ничего не придется, вам нужно только в тестовом поле (куда нужно писать сообщения) нажать правую кнопку мыши и выбрать в контекстном меню английский язык.

После этого шрифт в Скайриме должен стать английским. Таким же образом можно в самом начале игры ввести свое имя, чтобы в письмах и диалогах отсутствовали квадратики. Остался последний способ, объясняющий как поменять язык в консоли Скайрим.

Третий способ поменять язык

1. Перейдите по пути: C:Usersимя пользователяDocumentsMy GamesSkyrim, затем найдите и откройте файл Skyrim.ini.

2. Найдите следующие строки:

3. Сразу после них добавьте (не заменяйте, а именно добавьте) этот текст:

Все. Теперь в консоли вместо русского у вас будет английский язык. На этом мы завершаем наш обзоров возможных способов, как поменять язык в консоли игры The Elder Scrolls 5 Skyrim.

Источник

Skyrim как включить английский язык в консоли

В некоторых версиях Skyrim, почему-то не доступно переключение языка с русского на английский, не знаю на всех или нет, но проблема однозначно есть, в данном гайде я объясню как включить английский язык в консоли.

Способ который работает со всеми версиями:

1. Открываем Панель управления

2. Нажимаем на строчку: Смена раскладки клавиатуры или других способов ввода

3. В открывшемся окне нажимаем на вкладку Языки клавиатуры и затем на кнопку Изменить клавиатуру

4. Теперь в выпадающем меню выбираем язык по умолчанию английский и выделив русскую клавиатуру жмем кнопку удалить

Жмем применить, ок. Все, теперь в консоли можно писать на английском языке. У меня работает даже без перезапуска игры, но если вдруг у вас не получится — попробуйте перезапустить игру.

7. Теперь нам необходимо вернуть назад русскую раскладку и возможность переключать языки, для этого жмем кнопку Добавить и добавляем русскую клавиатуру:

Ставим язык по умолчанию Русский

Вот и все, таким нехитрым способом можно сменить раскладку в Skyrim на английскую, если вдруг у вас с этим возникают какие-то проблемы. Описанный выше способ показан на примере Windows 7, но в XP и Vista все делается аналогично.

Способ смены раскладки в Skyrim для лицензионных steam версий:

1. Во время игры входите в сообщество стим Shift+Tab
2. Выбираете любого друга и входите в режим переписки
3. Ненадо ничего писать,просто в текстовой строке (куда текст другу вводите) нажмите ПКМ и выберите в пункте «ЯЗЫК» английский!

Всё,у вас английский шрифт в игре!Также можно вначале игры ввести свой ник чтобы в некоторых игровых письмах и диалогах небыло квадратиков!

За способ благодарим Vault Boy

Источник