JavaScript:非Unicode字符代码转换为Unicode字符?

13

我在使用条形码扫描仪将字符输入到Web界面时,遇到了字符编码问题。

如果条形码有一个符号,比如-(破折号/连字号/减号),它会给我正确的字符代码189,这在许多字符集中都是正确的。实际上,如果当我进行扫描时选择文本输入,则它将按预期输入-字符。但是,如果我截取全局文档的keypress或keyup事件并使用fromCharCode()函数自己构建字符串,而不是让浏览器处理它,则我会得到½字符,这当然是189代码的Unicode转换。

在事件本身中,keyCode和“which”显示为189,而keyIdentifier为“U + 00BD”。不幸的是,我真正需要的charCode值始终为0。

现在当然,我可以手动处理此转换,只需5秒钟即可。问题是,我不知道扫描仪可能得到的完整代码集,并且我担心未经处理的字符可能在未来几周或几个月内出现并带来一些麻烦。或者,我可以上传原始字符代码到服务器,并尝试在PHP中处理它。出于时间和响应性的原因,我更喜欢在客户端处理它。向不可见的文本输入发送虚假按键也可能有效,但那是一个非常丑陋的解决方法。

看起来应该有更好的方法来解决这个问题,并且我肯定错过了一些显而易见的东西。有人有什么想法吗?


1
whichkeyCode 都是系统相关且已被弃用。event.key 的值是多少? - Sheepy
条形码扫描器是如何将字符输入到您的Web界面中的? - Ethan Lynn
这取决于浏览器,我会这么想? - flup
“然而,如果我拦截全局文档的keypress或keyup事件,并使用fromCharCode()函数自己构建字符串,而不是让浏览器处理它,您有什么特别的原因要这样做吗?为什么不只是使用隐藏输入并检测更改?” - Sworrub Wehttam
3个回答

5
如果您通过采用键码并使用fromCharCode将其解释为字符来拦截键盘处理,则会得到错误的结果,因为键码仅标识按键,而不是字符。与按键关联的字符取决于键盘驱动程序。因此,拦截程序需要了解键盘键分配。您可以使用常见的Windows键码作为起点,但然后您的软件将依赖于系统。

2

为了获得可靠的字符信息,应该使用 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 ½

这是你可以处理的事情吗?如果您想了解更多有关处理键盘事件的恐惧的信息,这篇文章是关于这个主题的好资源


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接