Javascript: код Unicode char для символа unicode?
У меня проблема с кодом символа со сканером штрих-кода, используемым для ввода символов в веб-интерфейс.
Если штрих-код имеет такой символ, как - (тире/дефис/минус), он дает мне код 189 символов, который является правильным во многих наборах символов. Действительно, если у меня есть текстовый ввод, выбранный при выполнении сканирования, он будет вводить символ, как и ожидалось. Однако, если я перехватываю событие keypress или keyup из глобального документа и использую функцию fromCharCode() для сборки самой строки, вместо того, чтобы позволить браузеру обрабатывать ее, я получаю символ ½, который, конечно же, является преобразованием юникода в 189 код.
В самом случае оба keyCode и "which" отображаются как 189, а keyIdentifier - "U + 00BD". К сожалению, значение charCode, которое мне действительно нужно, всегда равно 0.
Теперь, конечно, я могу обработать это преобразование вручную примерно через 5 секунд. Проблема в том, что я не знаю полного набора кодов, которые я мог бы получить со сканера, и я беспокоюсь о необработанном персонаже, который показывает недели или месяцы в будущем и вызывает некоторые головные боли. В качестве альтернативы я мог бы загружать необработанные коды символов на сервер и пытаться обрабатывать его на PHP. Я бы предпочел обработать его на клиенте по причинам времени и отзывчивости. Отправка фальшивых нажатий клавиш на невидимый ввод текста, вероятно, тоже будет работать, но это действительно хакерское решение.
Кажется, должен быть лучший способ сделать это, и что я должен упустить что-то очевидное. У кого-нибудь есть идеи?
Ответы
Ответ 1
Если вы перехватываете манипуляцию клавиатуры с помощью клавиш и интерпретируете их как символы с помощью fromCharCode
, вы получаете неправильные результаты, потому что коды клавиш просто идентифицируют нажатия клавиш, а не символы. Символ, связанный с нажатием клавиши, зависит от драйвера клавиатуры.
Таким образом, процедура перехвата должна знать назначение клавиш клавиатуры. Вы можете использовать обычный Windows keycodes в качестве отправной точки, но тогда ваше программное обеспечение будет зависящим от системы.
Ответ 2
Вы можете использовать charCodeAt();
var str = "HELLO WORLD";
var n = str.charCodeAt(0); //returns 72, the unicode value of H
ссылка:
http://www.w3schools.com/jsref/jsref_charCodeAt.asp
Ответ 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 ½
С этим вы можете работать? Если вы хотите больше узнать об ужасе работы с событиями клавиатуры, это отличная статья по теме.