Как преобразовать строку в символ Юникода?
В Javascript '\uXXXX'
возвращается символ юникода. Но как я могу получить символ Юникода, когда часть XXXX
является переменной?
Например:
var input = '2122';
console.log('\\u' + input); // returns a string: "\u2122"
console.log(new String('\\u' + input)); // returns a string: "\u2122"
Единственный способ, с помощью которого я могу заставить его работать, - использовать eval
; но я надеюсь, что там будет лучшее решение:
var input = '2122';
var char = '\\u' + input;
console.log(eval("'" + char + "'")); // returns a character: "™"
Ответы
Ответ 1
Используйте String.fromCharCode()
следующим образом: String.fromCharCode(parseInt(input,16))
. Когда вы помещаете значение Unicode в строку с помощью \u
, оно интерпретируется как шестнадцатеричное значение, поэтому вам нужно указать базу (16) при использовании parseInt
.
Ответ 2
String.fromCharCode("0x" + input)
или
String.fromCharCode(parseInt(input, 16))
, поскольку они являются 16-битными числами (UTF-16)
Ответ 3
JavaScript использует UCS-2 внутренне.
Таким образом, String.fromCharCode(codePoint)
не будет работать для дополнительных символов Юникода. Если codePoint
- 119558
(0x1D306
, для символа '𝌆'
), например.
Если вы хотите создать строку на основе кодовой точки без BMP Unicode, вы можете использовать Punycode.js функции утилиты для преобразования между строками UCS-2 и кодовыми точками UTF-16:
// `String.fromCharCode` replacement that doesn’t make you enter the surrogate halves separately
punycode.ucs2.encode([0x1d306]); // '𝌆'
punycode.ucs2.encode([119558]); // '𝌆'
punycode.ucs2.encode([97, 98, 99]); // 'abc'
Ответ 4
var hex = '2122';
var char = unescape('%u' + hex);
console.log(char);
вернет "™"