Лучший способ отобразить ошибки ввода слишком долго с Unicode? - PullRequest
3 голосов
/ 21 марта 2009

У кого-нибудь есть хорошие предложения по отображению ошибок «превышена максимальная длина» для пользователя, когда один символ не равен одному байту?

У меня нет слов, но я нашел цитату, которая более красноречива :

Если буфер переполняется на три байта, что вы скажете пользователю? Три байта могут быть одним, двумя или тремя символами, которые пользователь должен обрезать. В зависимости от того, какие символы они обрезают, результат может быть слишком длинным. И помните, что восприятие пользователем «персонажа», вероятно, ближе к графему или кластеру графем, чем к персонажу. Таким образом, они могут удалить слишком много символов, не осознавая этого. Наконец, если ограничение буфера небольшое (например, 10 или 20), в некоторых языках, таких как китайский, будет строго ограничено количество разрешенных символов.

У меня есть несколько ограничений: веб-сайт, управляемый формой, и размеры столбцов базовой базы данных не могут изменяться (на странице цитаты предлагается использовать 40-байтовый буфер и применять ограничение в 10 символов).

Ответы [ 4 ]

4 голосов
/ 21 марта 2009

Мой любимый способ решения этой проблемы - выделить часть ввода, которая превышает максимальную длину. Это обеспечивает визуальную подсказку относительно того, какая часть делает его "слишком длинным", без необходимости получать в детали того, сколько было байтов или символов.

Если вы можете использовать Javascript (например, если вам не нужно соответствовать стандартам 508), мне также нравится следить за длиной поля и оповещать пользователя, когда он слишком длинный (хотя все еще выполняется проверка на стороне сервера, конечно).

Если вы не хотите входить в сложный CSS внутри поля ввода, вы можете просто воспроизвести неверный ввод под полем и выделить его там.

2 голосов
/ 21 марта 2009

Очевидный правильный ответ - не ограничивать длину текста.

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

0 голосов
/ 22 марта 2009

Хороший вопрос. Не уверен, что есть хороший ответ, кроме изменения схемы для использования символов Unicode вместо байтов. Например, в SQL Server с NVARCHAR или MySQL с UTF-8 столбцы параметров сортировки ограничены длиной символа. Это немного подталкивает к тому, что «длины столбцов не могут изменяться», конечно, даже если они технически имеют одинаковую «длину».

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

Вы, в общем-то, не можете ожидать, что кто-нибудь получит номера байтов UTF-8. Возможно, на стороне клиента вы могли бы сделать это чисто визуально, используя строку «использованное количество» вместо количества байтов:

<style type="text/css">
    .field { width: 12em; }
    .field input { width: 100%; }
    .field input { box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; -webkit-box-sizing: border-box; -khtml-box-sizing: border-box; }
    .indicator { background: blue; height: 5px; }
    .indicator-over { background: red; height: 5px; }
</style>

<div class="field">
    <input type="text" name="pwd" class="limited-12">
</div>

<script type="text/javascript">
    function limitInput(element, limit) {
        var indicator= document.createElement('div');
        element.parentNode.insertBefore(indicator, element.nextSibling);
        element.onchange=element.onkeyup= function() {
            var utf8= unescape(encodeURIComponent(element.value));
            indicator.className= utf8.length>limit? 'indicator-over' : 'indicator';
            var used= Math.min(utf8.length/limit, 1);
            indicator.style.width= Math.floor(used*100)+'%';
        }
        element.onchange();
    }

    var inputs= document.getElementsByTagName('input');
    for (var i= inputs.length; i-->0;)
        if (inputs[i].className.substring(0, 8)=='limited-')
            limitInput(inputs[i], parseInt(inputs[i].className.substring(8)));
</script>
0 голосов
/ 21 марта 2009

Просто мысли вслух ... почему бы не быть менее конкретным: "максимальная длина превышена на N" (например, "максимальная длина превышена на 4"). Вы не говорите пользователю, что максимальная длина ... просто, что они N над ним. И вы не говорите пользователю, что представляет N (байты) ... когда они видят сообщение "слишком длинно на 3" ... они удаляют как минимум 3 символа (даже если они могут удалить 9 фактических байтов).

Я полагаю, что просто нет способа объяснить пользователям, почему определенные «символы» требуют нескольких байтов, что с большой вероятностью не смущает их.

...