static character(event) {
        let result;
        if (event.key === 'Unidentified' || event.key === void(0) || this.isSeleniumBot()) {
            //XXX The selenium geckodriver does not understand `event.key`, hence when using it, we need to rely on the old deprecated `keyCode` attribute, cf. upstream issue https://github.com/mozilla/geckodriver/issues/440
            // Use the old deprecated keyCode property, if the new `key` one is not supported
            const keyCode = this.keyCodeNumber(event);
            if (keyCode === 229) { // Android Chrome returns the same keycode number 229 for all keys pressed
                return AutoNumericEnum.keyName.AndroidDefault;
            }

            const potentialResult = AutoNumericEnum.fromCharCodeKeyCode[keyCode];
            if (!AutoNumericHelper.isUndefinedOrNullOrEmpty(potentialResult)) {
                // Since `String.fromCharCode` do not return named keys for some keys ('Escape' and 'Enter' for instance), we convert the characters to the key names
                result = potentialResult;
            } else {
                result = String.fromCharCode(keyCode);
            }
        } else {
            switch (event.key) {
                // Manages all the special cases for obsolete browsers that return the non-standard names
                case 'Add':
                    result = AutoNumericEnum.keyName.NumpadPlus;
                    break;
                case 'Apps':
                    result = AutoNumericEnum.keyName.ContextMenu;
                    break;
                case 'Crsel':
                    result = AutoNumericEnum.keyName.CrSel;
                    break;
                case 'Decimal':
                    if (event.char) {
                        // this fixes #602
                        result = event.char;
                    } else {
                        result = AutoNumericEnum.keyName.NumpadDot;
                    }
                    break;
                case 'Del':
                    result = AutoNumericEnum.keyName.Delete;
                    break;
                case 'Divide':
                    result = AutoNumericEnum.keyName.NumpadSlash;
                    break;
                case 'Down':
                    result = AutoNumericEnum.keyName.DownArrow;
                    break;
                case 'Esc':
                    result = AutoNumericEnum.keyName.Esc;
                    break;
                case 'Exsel':
                    result = AutoNumericEnum.keyName.ExSel;
                    break;
                case 'Left':
                    result = AutoNumericEnum.keyName.LeftArrow;
                    break;
                case 'Meta':
                case 'Super':
                    result = AutoNumericEnum.keyName.OSLeft;
                    break;
                case 'Multiply':
                    result = AutoNumericEnum.keyName.NumpadMultiply;
                    break;
                case 'Right':
                    result = AutoNumericEnum.keyName.RightArrow;
                    break;
                case 'Spacebar':
                    result = AutoNumericEnum.keyName.Space;
                    break;
                case 'Subtract':
                    result = AutoNumericEnum.keyName.NumpadMinus;
                    break;
                case 'Up':
                    result = AutoNumericEnum.keyName.UpArrow;
                    break;
                default:
                    // The normal case
                    result = event.key;
            }
        }

        return result;
    }
Return the character from the event key code.
If the KeyboardEvent does not represent a printable character, then the key name is used (ie. 'Meta', 'Shift', 'F1', etc.)
@example character(50) => '2'

@param {KeyboardEvent} event
@returns {string}