Bug 9289

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

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

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

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

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

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

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

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

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

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

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

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

В том то и дело, что с правильно выставленным LC_CTYPE (у нас сейчас по
умолчанию en_US.utf8) никаких артефактов я не вижу.
------- Comment #18 From 2009-01-10 03:32:43 -------
А давайте вы оба покажете вывод locale(1) и сверите? А то обмениваетесь
информацией о локалях так, будто это карты на руках и вы не хотите их
раскрывать :)
------- Comment #19 From 2009-01-10 03:38:18 -------
О, Миша надоумил, теперь понятно в чём проблема, но непонятно как исправлять
для обновляемых систем:
$ 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 From 2009-01-10 03:41:16 -------
(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 From 2009-01-10 03:48:57 -------
Явно проблема в 
$ cat /etc/rpm/macros
%_install_langs ru

Я знаю как это чинить. Не знаю как чинить для старых (когда инсталятор
прописывал такое) систем.
------- Comment #22 From 2009-01-10 03:55:06 -------
(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 From 2009-01-10 03:58:09 -------
Если при апгрейде 4.0->4.1 не добавлялась отсутствующая локаль, то закрывать не
надо, а надо сделать добавление этой локали при апгрейде 4.1->5.0|Сизиф.
------- Comment #24 From 2009-01-10 04:11:01 -------
(In reply to comment #23)
> Если при апгрейде 4.0->4.1 не добавлялась отсутствующая локаль, то закрывать не
> надо, а надо сделать добавление этой локали при апгрейде 4.1->5.0|Сизиф.

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

"Ваш locale(1) показывает, что у вас нет локалей foo_FOO.BAR и baz_BAZ.BAZ.
Возможно, это ошибка установщика < 4.1. Для решения этой проблемы уберите то-то
оттуда-то и сделайте такое-то приплясывание".
------- Comment #26 From 2009-01-10 10:07:32 -------
И куда выводить такое предупреждение ?

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

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

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

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 From 2012-04-08 19:53:19 -------
[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 ~]# _