LINUX.ORG.RU

backspace удаляет по одному байту в стандартном вводе

 


0

1

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

input = gets.chomp
p input 

Сначала вводим
человек
3 раза жмем backspace, остается
чело
жмем enter, выводится
«челов\xD0»

На С эффект точно такой же. В C использовал scanf для считывания. Оба языка я знаю плохо, но, мне кажется, раз в двух языках сработало одинаково, то проблема в системе где-то, хотя могу быть не прав.



Последнее исправление: Sharzon (всего исправлений: 2)

Напиши хоть какая система, какой терминал. Проблема точно не в «языках».

arturpub ★★
()

Настрой/смени терминал, locale, ...

sdio ★★★★★
()

И это не девелопмент. Перемести в десктоп или генерал.

arturpub ★★
()

не знаю ruby, но думаю там тоже как то регулируется локаль. аналог так сказать setlocale

Atlant ★★★★★
()
Ответ на: комментарий от S-Mage

У тебя тут все буквы однобайтные, а у тс-а глупый терминал по бэкспейсу жрет один байт, хотя локаль явно UTF-8.

arturpub ★★
()
Ответ на: комментарий от arturpub

Нет, с русскими буквами тоже все в порядке.

S-Mage ★★
()

Система Ununtu 12.04.2 LTS. Версия ядра 3.2.0-51-generic Вывод locale

LANG=ru_UA.UTF-8 LANGUAGE=ru_UA:ru LC_CTYPE=«ru_UA.UTF-8» LC_NUMERIC=«ru_UA.UTF-8» LC_TIME=«ru_UA.UTF-8» LC_COLLATE=«ru_UA.UTF-8» LC_MONETARY=«ru_UA.UTF-8» LC_MESSAGES=«ru_UA.UTF-8» LC_PAPER=«ru_UA.UTF-8» LC_NAME=«ru_UA.UTF-8» LC_ADDRESS=«ru_UA.UTF-8» LC_TELEPHONE=«ru_UA.UTF-8» LC_MEASUREMENT=«ru_UA.UTF-8» LC_IDENTIFICATION=«ru_UA.UTF-8» LC_ALL=

Sharzon
() автор топика

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

Artificial_Thought ★★★★
()
Ответ на: комментарий от theNamelessOne

GNOME Terminal Ты уже не один такой. Печально натыкаться на такую фигню, когда только начинаешь знакомиться с языком. Вроде, тривиальную задачу выполнить надо, а, нет, не получается.

Sharzon
() автор топика

Проверь, задана ли у тебя кодировка в начале скрипта:

#!/usr/bin/env ruby
# encoding: UTF-8
# coding: UTF-8

Если не поможет, ниже еще задай:

Encoding.default_external = 'UTF-8'
Encoding.default_internal = 'UTF-8' 

Novator ★★★★★
()

Нагуглил, наконец-то.
Помогла команда
stty iutf8

Интересно узнать, теперь, у всех в stty выставлен этот флаг?

Sharzon
() автор топика
Ответ на: комментарий от Novator

Ага. Надо почитать насчет это stty, а то, неужели, указать стандартному вводу воспринмать символы можно только в utf-8? Или и другие юникодовские кодировки можно? Ушел читать маны.

Sharzon
() автор топика
Ответ на: комментарий от Sharzon

Кодировок до лешего можно навключать. Но лучше всегда по-возможности использовать UTF-8 имхуется мне, ибо шарик сжимается, и языки какие угодно могут всплыть.

p.s. И кстати, у меня включен iutf8:

stty
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8
Lubuntu 12.4

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

Тогда не понимаю, почему у меня вырублено. Если стандартно в Убунте везде utf-8 стоит, то и стандартный ввод, по идее, должен быть готов воспринять utf-8. Либо какое-то ПО, что я устанавливал изменило флаг, либо его там и не было. Сам-то я с этой утилитой даже не сталкивался.

Sharzon
() автор топика
Ответ на: комментарий от Sharzon

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

Novator ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.