public static void isLegalTableQualifierName(final byte[] qualifierName, int start, int end,
    boolean isSnapshot) {
    if (end - start < 1) {
      throw new IllegalArgumentException(
        isSnapshot ? "Snapshot" : "Table" + " qualifier must not be empty");
    }
    String qualifierString = Bytes.toString(qualifierName, start, end - start);
    if (qualifierName[start] == '.' || qualifierName[start] == '-') {
      throw new IllegalArgumentException("Illegal first character <" + qualifierName[start]
        + "> at 0. " + (isSnapshot ? "Snapshot" : "User-space table")
        + " qualifiers can only start with 'alphanumeric " + "characters' from any language: "
        + qualifierString);
    }
    if (qualifierString.equals(DISALLOWED_TABLE_NAME)) {
      // Per https://zookeeper.apache.org/doc/r3.4.10/zookeeperProgrammers.html#ch_zkDataModel
      // A znode named "zookeeper" is disallowed by zookeeper.
      throw new IllegalArgumentException("Tables may not be named '" + DISALLOWED_TABLE_NAME + "'");
    }
    for (int i = 0; i < qualifierString.length(); i++) {
      // Treat the string as a char-array as some characters may be multi-byte
      char c = qualifierString.charAt(i);
      // Check for letter, digit, underscore, hyphen, or period, and allowed by ZK.
      // ZooKeeper also has limitations, but Character.isAlphabetic omits those all
      // See https://zookeeper.apache.org/doc/r3.4.10/zookeeperProgrammers.html#ch_zkDataModel
      if (Character.isAlphabetic(c) || Character.isDigit(c) || c == '_' || c == '-' || c == '.') {
        continue;
      }
      throw new IllegalArgumentException("Illegal character code:" + (int) c + ", <" + c + "> at "
        + i + ". " + (isSnapshot ? "Snapshot" : "User-space table")
        + " qualifiers may only contain 'alphanumeric characters' and digits: " + qualifierString);
    }
  }
Qualifier names can only contain 'word' characters <code>[\p{IsAlphabetic}\p{Digit}]</code> or
'_', '.' or '-'. The name may not start with '.' or '-'.
@param qualifierName byte array containing the qualifier name
@param start         start index
@param end           end index (exclusive)
hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java