Bug 9289

Summary: некорректное удаление русских символов в однобайтной локали в терминале UTF-8
Product: Sisyphus Reporter: Anton Farygin <rider>
Component: libreadlineAssignee: Dmitry V. Levin <ldv>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P2 CC: dottedmag, glebfm, mike, php-coder
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 10446    

Description Anton Farygin 2006-03-20 19:04:06 MSK
Воспроизводится так:
запустить xterm в локали UTF-8, перейти на пользователя root через su -,
написать:  echo "тест" (тест - на русском), выполнить, нажать стрелку вверх,
удалить "ст", выполнить.
Удаляется только один последний символ.
у рута локаль POSIX, система установлена в ru_RU.UTF-8. Последний Sisyphus.

[root@rider ~]# echo "тест"
тест
[root@rider ~]# echo "те"
тес
Comment 1 Anton Farygin 2006-03-20 19:05:34 MSK
под пользователем удаление работает нормально.
Comment 2 Anton Farygin 2006-03-20 19:06:44 MSK
с выставленным LC_CTYPE=ru_RU.UTF-8 у рута всё работает нормально.
Comment 3 Dmitry V. Levin 2006-03-20 19:10:12 MSK
версия какая?
Comment 4 Dmitry V. Levin 2006-03-20 19:20:01 MSK
Воспроизводится с libreadline-5.1.4-alt1.
Comment 5 Anton Farygin 2006-03-20 19:48:42 MSK
аналогичная проблема вылезает с нажатием клавиши HOME, для перехода в начало
строки при вытаскивании строки с русским текстом из HISTORY.

Только там по нажатию на HOME курсор перелезает на <количество юникодных
символов в строке" левее его нормального местоположения.

с LC_CTYPE, выставленным в UTF-8 локаль - также не воспроизводится.
Comment 6 Michael Shigorin 2006-11-12 20:21:27 MSK
А при чём тут тогда summary?  Локаль-то не UTF-8, а POSIX.  Бишь local
misconfiguration или бага в том, что выставило этот POSIX.  Или я опять чего-то
не понимаю?
Comment 7 Dmitry V. Levin 2007-03-31 23:56:14 MSD
Миша прав, речь идёт о том, что локаль однобайтная, в то время как терминал
мультибайтный.
Comment 8 Anton Farygin 2007-04-01 01:29:53 MSD
Кстати, должно вылечиться тем же самым LC_CTYPE в en_US.UTF-8.

Вместо которого очень хотелось бы видеть у рута ru_RU.UTF-8 или то, что
выставлено в /etc/sysconfig/i18n
Ибо у некоторых не установлены никакие локали кроме ru ;)

Точнее говоря - у всех пользователей 3.0. Так что после обновления у них эта
проблема не исчезнет.
Comment 9 Michael Shigorin 2007-08-17 10:38:42 MSD
INVALID или FIXED?
Comment 10 Dmitry V. Levin 2007-09-20 04:25:44 MSD
Fixed by rootfiles-alt-alt9.3
Comment 11 Anton Farygin 2007-09-20 14:42:40 MSD
$ rpm -q rootfiles-alt
rootfiles-alt-alt9.3

на branch-4.0 у меня воспроизводится:
xterm
su -

попытка ввода и удаления русских символов в cmdline
Comment 12 Anton Farygin 2007-09-20 14:43:14 MSD
хотя видимо может быть нужно что-то прописать в конфиг ?

Обновление пакета поможет или нет ?
Comment 13 Slava Semushin 2009-01-10 01:05:53 MSK
Баг актуален?
Comment 14 Anton Farygin 2009-01-10 02:25:22 MSK
Вполне, воспроизводится ещё проще:
LC_ALL=C bash
вводим русский текст, давим backspace до упора.
Comment 15 Dmitry V. Levin 2009-01-10 02:39:25 MSK
(In reply to comment #14)
> Вполне, воспроизводится ещё проще:
> LC_ALL=C bash
> вводим русский текст, давим backspace до упора.

Ну да, так воспроизводится, но зачем обманывать readline?
Так ведь работает правильно:
LC_CTYPE=$LANG LANG=C bash
Comment 16 Anton Farygin 2009-01-10 03:01:30 MSK
Да, но под рутом не работает с таким же диагнозом.

LC_CTYPE там равен en_US.utf8, проблема воспроизводится и из под пользователя (с LC_CTYPE=en_US.utf8)
Comment 17 Dmitry V. Levin 2009-01-10 03:30:58 MSK
(In reply to comment #16)
> Да, но под рутом не работает с таким же диагнозом.
> 
> LC_CTYPE там равен en_US.utf8, проблема воспроизводится и из под пользователя (с
> LC_CTYPE=en_US.utf8)
> 

В том то и дело, что с правильно выставленным LC_CTYPE (у нас сейчас по умолчанию en_US.utf8) никаких артефактов я не вижу.
Comment 18 Mikhail Gusarov 2009-01-10 03:32:43 MSK
А давайте вы оба покажете вывод locale(1) и сверите? А то обмениваетесь информацией о локалях так, будто это карты на руках и вы не хотите их раскрывать :)
Comment 19 Anton Farygin 2009-01-10 03:38:18 MSK
О, Миша надоумил, теперь понятно в чём проблема, но непонятно как исправлять для обновляемых систем:
$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=C
LC_CTYPE=en_US.utf8
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

Comment 20 Dmitry V. Levin 2009-01-10 03:41:16 MSK
(In reply to comment #19)
> О, Миша надоумил, теперь понятно в чём проблема, но непонятно как исправлять
> для обновляемых систем:
> $ locale
> locale: Cannot set LC_CTYPE to default locale: No such file or directory
> locale: Cannot set LC_ALL to default locale: No such file or directory
> LANG=C
> LC_CTYPE=en_US.utf8

А в чём проблема?
$ rpmquery -f /usr/lib*/locale/en_US.utf8
glibc-locales-2.9-alt2
Comment 21 Anton Farygin 2009-01-10 03:48:57 MSK
Явно проблема в 
$ cat /etc/rpm/macros
%_install_langs ru

Я знаю как это чинить. Не знаю как чинить для старых (когда инсталятор прописывал такое) систем.
Comment 22 Dmitry V. Levin 2009-01-10 03:55:06 MSK
(In reply to comment #21)
> Явно проблема в 
> $ cat /etc/rpm/macros
> %_install_langs ru
> 
> Я знаю как это чинить. Не знаю как чинить для старых (когда инсталятор
> прописывал такое) систем.

Не помню, installer в 4.0 это ещё прописывал?
В 4.1 этого уже точно не было, см. https://bugzilla.altlinux.org/show_bug.cgi?id=14117#c14

Если всё дело в этом, то надо закрывать с resolution=NOTABUG.
Comment 23 Mikhail Gusarov 2009-01-10 03:58:09 MSK
Если при апгрейде 4.0->4.1 не добавлялась отсутствующая локаль, то закрывать не надо, а надо сделать добавление этой локали при апгрейде 4.1->5.0|Сизиф.
Comment 24 Dmitry V. Levin 2009-01-10 04:11:01 MSK
(In reply to comment #23)
> Если при апгрейде 4.0->4.1 не добавлялась отсутствующая локаль, то закрывать не
> надо, а надо сделать добавление этой локали при апгрейде 4.1->5.0|Сизиф.

Это уже совсем другая история.  Спорная, между прочим.
Ибо неясно, как отличить записанное при установке от записанного вручную.
Comment 25 Mikhail Gusarov 2009-01-10 04:15:03 MSK
Ну, тогда хотя бы предупреждение вывести.

"Ваш locale(1) показывает, что у вас нет локалей foo_FOO.BAR и baz_BAZ.BAZ. Возможно, это ошибка установщика < 4.1. Для решения этой проблемы уберите то-то оттуда-то и сделайте такое-то приплясывание".

Comment 26 Anton Farygin 2009-01-10 10:07:32 MSK
И куда выводить такое предупреждение ?

нужно что бы его однозначно увидел человек при обновлении - мимо не прошёл.

На мой взгляд, проще зафиксировать необходимость установки en_US в документации и радоваться жизни.
Comment 27 Mikhail Gusarov 2009-01-10 13:49:29 MSK
Выплёвывать из скрипта апгрейда. Насколько я помню, это считается надёжным местом, его даже GUI-фронтэнды пользователю суют.

А те, кто не смотрит на лог дист-апгрейда - те и в документацию не заглянут.
Comment 28 Michael Shigorin 2009-01-10 16:06:31 MSK
что-то вроде 

grep -q '^%_install_langs.*en_US' /etc/rpm/macros || \
sed -i 's/^%_install_langs .*$/&:en_US/' /etc/rpm/macros && \
apt-get reinstall glibc-locales
Comment 29 Michael Shigorin 2012-04-08 19:53:19 MSK
[root@pad ~]# echo "тест"
тест
[root@pad ~]# echo "те"
те
[root@pad ~]# locale
LANG=ru_RU.UTF-8
LC_CTYPE=uk_UA.UTF-8
LC_NUMERIC=C
LC_TIME=C
LC_COLLATE=uk_UA.UTF-8
LC_MONETARY=C
LC_MESSAGES=C
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
[root@pad ~]# ls -l /root/.i18n 
-rw------- 1 root root 181 Jun 10  2010 /root/.i18n
[root@pad ~]# cat /root/.i18n
LANGUAGE=POSIX
LANG=POSIX

eval `sed -n '/^LANG=[^.[:space:]]\+\.[Uu][Tt][Ff]-\?8[[:space:]]*$/ s/LANG=.*/NEED_UNICODE=1 LC_CTYPE=en_US.utf8/p' /etc/sysconfig/i18n 2>/dev/null` ||:
[root@pad ~]# rpm -qf /root/.i18n
rootfiles-alt-alt11
[root@pad ~]# _