Here is a slightly useless, yet sometimes handy, function if you quickly need to spit out an ordered sequence of unicode characters between a range (e.g., U+007F to U+009F).
/**
* If you need the string representation, there is a handy
* 'unicode' property you can query on the returned object.
*
* @param {string} from is a HEX code you want to start from.
* @param {string} to is a HEX code you want to end with.
* @return {array} the unicode range from - to.
**/
function unicodeSequence(from, to) {
'use strict';
var code,
index = parseInt(String(from), 16),
end = parseInt(String(to), 16),
result = [],
unicode = '';
if (isNaN(index) || isNaN(end)) {
throw new TypeError('Invalid input');
}
for (; index <= end; index++) {
code = index.toString(16).toUpperCase();
//makes unicode code like '00AB'
while (code.length < 4) {
code = '0' + code;
}
//concatenate so we get a unicode string
result.push('\\u' + code);
unicode += String.fromCharCode(index);
}
Object.defineProperty(result, 'unicode', {
get: function() {
return unicode;
}
});
return result;
}
//Example
var r = unicodeSequence('40', '7E');
console.log(String(r.join(', ')));
console.log(r.unicode);
Why?
In a lot of specs (e.g., in HTML), you see unicode ranges that when encountered have particular side effects (e.g., a parse error). In the specs, however, instead of listing out all the values in a range, the editor will just write, for example, “U+007F to U+009F“. So, obviously, when implementing a spec, one needs a way of expanding these ranges.