【问题标题】:Javascript: Non-unicode char code to unicode character?Javascript:非Unicode字符代码到Unicode字符?
【发布时间】:2013-10-17 03:59:57
【问题描述】:

我在用于将字符输入到 Web 界面的条形码扫描仪上遇到字符代码问题。

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

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

现在我当然可以在大约 5 秒内手动处理此转换。问题是我不知道可能从扫描仪获得的完整代码集,而且我担心未处理的字符会在未来数周或数月后出现并让人头疼。或者,我可以将原始字符代码上传到服务器并尝试在 PHP 中处理它。不过,出于时间和响应性的原因,我更愿意在客户端处理它。将假按键发送到不可见的文本输入可能也可以,但这是一个非常糟糕的解决方法。

似乎应该有更好的方法来做到这一点,而且我必须遗漏一些明显的东西。有人有什么想法吗?

【问题讨论】:

  • whichkeyCode 都依赖于系统并且已弃用。 event.key 的值是多少?
  • 条码扫描器如何准确地将字符输入到您的 Web 界面?
  • 这取决于浏览器,我希望?
  • "However, if I intercept the keypress or keyup event from the global document and use the fromCharCode() function to build the string myself, rather than letting the browser handle it" 你有什么特别的理由要这样做吗?为什么不直接使用隐藏输入并检测变化?

标签: javascript unicode character-encoding keypress keycode


【解决方案1】:

您应该使用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 ½

这是你可以使用的东西吗?如果您想了解更多关于使用键盘事件的恐惧,this is a great piece on the subject

【讨论】:

    【解决方案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】:

      如果您通过获取键码并将其解释为带有fromCharCode 的字符来拦截键盘处理,则会得到错误的结果,因为键码只是识别按键,而不是字符。与按键相关的字符取决于键盘驱动程序。

      所以拦截例程需要知道键盘按键分配。您可以使用常见的Windows keycodes 作为起点,但是您的软件将依赖于系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-04
        • 2017-07-25
        • 2021-11-08
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        相关资源
        最近更新 更多