Подтвердить что ты не робот

Javascript: код Unicode char для символа unicode?

У меня проблема с кодом символа со сканером штрих-кода, используемым для ввода символов в веб-интерфейс.

Если штрих-код имеет такой символ, как - (тире/дефис/минус), он дает мне код 189 символов, который является правильным во многих наборах символов. Действительно, если у меня есть текстовый ввод, выбранный при выполнении сканирования, он будет вводить символ, как и ожидалось. Однако, если я перехватываю событие keypress или keyup из глобального документа и использую функцию fromCharCode() для сборки самой строки, вместо того, чтобы позволить браузеру обрабатывать ее, я получаю символ ½, который, конечно же, является преобразованием юникода в 189 код.

В самом случае оба keyCode и "which" отображаются как 189, а keyIdentifier - "U + 00BD". К сожалению, значение charCode, которое мне действительно нужно, всегда равно 0.

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

Кажется, должен быть лучший способ сделать это, и что я должен упустить что-то очевидное. У кого-нибудь есть идеи?

4b9b3361

Ответ 1

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

Таким образом, процедура перехвата должна знать назначение клавиш клавиатуры. Вы можете использовать обычный Windows keycodes в качестве отправной точки, но тогда ваше программное обеспечение будет зависящим от системы.

Ответ 3

Вы должны использовать событие keypress для получения надежной информации о символах. Все браузеры сохраняют код символа в свойстве события which. За исключением IE8 и ниже, они сохраняют код символа в свойстве keyCode.

Итак, чтобы получить правильный код символа для данного события keypress, используйте следующее:

document.addEventListener('keypress', function (event) {
    // Get the proper character code
    var charCode = (typeof event.which === 'number') ? event.which : event.keyCode;

    // Do stuff
});

Вы можете легко проверить результат, открыв новую вкладку, назовите ее about:blank и введите следующую команду в консоль разработчика:

document.addEventListener('keypress', function (event) {
    // Get the proper character code
    var charCode = (typeof event.which === 'number') ? event.which : event.keyCode;

    console.log('charCode = ' + charCode);
    console.log('fromCharCode returns ' + String.fromCharCode(charCode));
});

Вывод при вводе тире:

charCode = 45
fromCharCode returns -

Сравните это с наблюдением события keyup. Если вы изменили приведенный выше пример, чтобы прослушать событие keyup, выход для тире будет:

charCode = 189
fromCharCode returns ½

С этим вы можете работать? Если вы хотите больше узнать об ужасе работы с событиями клавиатуры, это отличная статья по теме.