isChinese.js

import { toString } from 'ut2';
import { objectValues } from './utils/native';
var chineseDictionary = {
    // 基本汉字
    chineseBasic: '[\u4e00-\u9fa5]',
    // 基本汉字补充
    chineseExtend: '[\u9ea6-\u9fff]',
    // 兼容性表意文字
    chineseExtend2: '[\uF900-\uFAD9]',
    // 汉字扩展A
    chineseExtendA: '[\u3400-\u4DBF]',
    // 汉字扩展B
    chineseExtendB: "[\uD840\uDC00-\uD869\uDEDF]",
    // 汉字扩展C
    chineseExtendC: "[\uD869\uDF00-\uD86D\uDF38]",
    // 汉字扩展D
    chineseExtendD: "[\uD86D\uDF40-\uD86E\uDC1D]",
    // 汉字扩展E
    chineseExtendE: "[\uD86E\uDC20-\uD873\uDEA1]",
    // 汉字扩展F
    chineseExtendF: "[\uD873\uDEB0-\uD87A\uDFE0]",
    // 汉字扩展G
    chineseExtendG: "[\uD880\uDC00-\uD884\uDF4A]",
    // 汉字扩展H
    chineseExtendH: "[\uD884\uDF50-\uD888\uDFAF]",
    // 汉字扩展I
    chineseExtendI: "[\uD87A\uDFF0-\uD87B\uDE5D]"
};
var looseChineseRegExp = chineseDictionary.chineseBasic + '+';
var chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';
var chineseWithExtend = '(?:' + objectValues(chineseDictionary).join('|') + ')';
var looseChineseExtendRegExp = chineseWithExtend + '+';
var chineseExtendRegExp = '^' + chineseWithExtend + '+$';
// eslint-disable-next-line no-prototype-builtins
var supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');
/**
 * 检测值是否为中文
 *
 * @static
 * @alias module:Validator.isChinese
 * @since 1.1.0
 * @see {@link http://www.unicode.org/reports/tr38/#BlockListing | 4.4 Listing of Characters Covered by the Unihan Database}
 * @see {@link https://zh.wikipedia.org/wiki/Unicode字符平面映射 | Unicode字符平面映射}
 * @see {@link https://zh.wikipedia.org/wiki/Unicode區段 | Unicode区段}
 * @param {*} value 要检测的值
 * @param {Object} [options] 配置项
 * @param {boolean} [options.loose=false] 宽松模式。如果为true,只要包含中文即为true
 * @param {boolean} [options.useExtend=false] 使用统一表意文字扩展A-I。注意:如果不支持 `RegExp.prototype.unicode`,扩展字符集将自动不生效,如IE浏览器。
 * @returns {boolean} 值是否为中文
 * @example
 *
 * isChinese('林某某'); // true
 * isChinese('林A'); // false
 *
 * // 宽松模式,只要包含中文即为true
 * isChinese('林A', { loose: true }); // true
 * isChinese('A林A', { loose: true }); // true
 *
 * // 扩展字符集的字符
 * isChinese('𠮷'); // false
 *
 * // 使用中文扩展字符集,需要浏览器支持 RegExp.prototype.unicode 才生效。
 * isChinese('𠮷', { useExtend: true }); // true
 * isChinese('𠮷aa', { useExtend: true, loose: true }); // true
 *
 */
function isChinese(value, options) {
    if (options === void 0) { options = {}; }
    var _a = options.loose, loose = _a === void 0 ? false : _a, _b = options.useExtend, useExtend = _b === void 0 ? false : _b;
    var valueStr = toString(value);
    var basicRegExp = loose ? looseChineseRegExp : chineseRegExp;
    var extendRegExp = loose ? looseChineseExtendRegExp : chineseExtendRegExp;
    var hasExtend = useExtend && supportRegExpUnicode;
    var resultRegExp = hasExtend ? extendRegExp : basicRegExp;
    var flag = hasExtend ? 'u' : undefined;
    var reg = new RegExp(resultRegExp, flag);
    return reg.test(valueStr);
}
export default isChinese;