16

I'm using a barcode scanner to read a barcode on my website (the website is made in OpenUI5).

The scanner works like a keyboard that types the characters it reads. At the end and the beginning of the typing it uses a special character. These characters are different for every type of scanner.

Some possible characters are:

In my code I use if (oModelScanner.oData.scanning && oEvent.key == "\u2584") to check if the input from the scanner is ▄.

Is there any way to get the code from that character in the \uHHHH style? (with the HHHH being the hexadecimal code for the character)

I tried the charCodeAt but this returns the decimal code.

With the codePointAt examples they make the code I need into a decimal code so I need a reverse of this.

dda
  • 6,030
  • 2
  • 25
  • 34
J_rite
  • 572
  • 1
  • 12
  • 28

3 Answers3

21

Javascript strings have a method codePointAt which gives you the integer representing the Unicode point value. You need to use a base 16 (hexadecimal) representation of that number if you wish to format the integer into a four hexadecimal digits sequence (as in the response of Nikolay Spasov).

var hex = "▄".codePointAt(0).toString(16);
var result = "\\u" + "0000".substring(0, 4 - hex.length) + hex;

However it would probably be easier for you to check directly if you key code point integer match the expected code point

oEvent.key.codePointAt(0) === '▄'.codePointAt(0);

Note that "symbol equality" can actually be trickier: some symbols are defined by surrogate pairs (you can see it as the combination of two halves defined as four hexadecimal digits sequence).

For this reason I would recommend to use a specialized library.

you'll find more details in the very relevant article by Mathias Bynens

laurent
  • 2,590
  • 18
  • 26
  • 1
    `codePointAt` does not return the code point _in decimal_. It returns _just the number_. Whether it is decimal or hexadecimal only becomes relevant later, when that number is printed somewhere. – Roland Illig Dec 28 '20 at 15:35
  • This is correct: a number has a given value independently of the base used by one of its representation. However in the context of comparison the representation of a number is important as well, for example: 56 !== 0x56 (86) but more importantly '\u0056'.codePointAt(0) !== 56, which is often confusing – laurent Dec 29 '20 at 16:32
  • What if your codepoint is greater than `FFFF`? For example, `''.codePointAt(0).toString(16)` returns `'1000a'` – Boris Verkhovskiy Apr 07 '21 at 08:36
7

If you want to print the multiple code points of a character, e.g., an emoji, you can do this:

const facepalm = "‍♂️";
const codePoints = Array.from(facepalm)
  .map((v) => v.codePointAt(0).toString(16))
  .map((hex) => "\\u{" + hex + "}");
console.log(codePoints);

["\u{1f926}", "\u{1f3fc}", "\u{200d}", "\u{2642}", "\u{fe0f}"]

If you are wondering about the components and the length of ‍♂️, check out this article.

Sanghyun Lee
  • 21,644
  • 19
  • 100
  • 126
6
var hex = "▄".charCodeAt(0).toString(16);
var result = "\\u" + "0000".substring(0, 4 - hex.length) + hex;
Nikolay Spasov
  • 376
  • 7
  • 17