📄 verifier.java
字号:
return null;
}
/**
* <p>
* Checks a string to see if it is a legal RFC 2396 URI.
* Both absolute and relative URIs are supported.
* </p>
*
* @param uri <code>String</code> to check.
* @return <code>String</code> reason the URI is illegal, or
* <code>null</code> if OK.
*/
public static String checkURI(String uri) {
// URIs can be null or empty
if ((uri == null) || (uri.equals(""))) {
return null;
}
for (int i = 0; i < uri.length(); i++) {
char test = uri.charAt(i);
if (!isURICharacter(test)) {
String msgNumber = "0x" + Integer.toHexString(test);
if (test <= 0x09) msgNumber = "0x0" + Integer.toHexString(test);
return "URIs cannot contain " + msgNumber;
} // end if
if (test == '%') { // must be followed by two hexadecimal digits
try {
char firstDigit = uri.charAt(i+1);
char secondDigit = uri.charAt(i+2);
if (!isHexDigit(firstDigit) ||
!isHexDigit(secondDigit)) {
return "Percent signs in URIs must be followed by "
+ "exactly two hexadecimal digits.";
}
}
catch (StringIndexOutOfBoundsException e) {
return "Percent signs in URIs must be followed by "
+ "exactly two hexadecimal digits.";
}
}
} // end for
// If we got here, everything is OK
return null;
}
/**
* <p>
* This is a utility function for determining whether a specified
* Unicode character is a hexadecimal digit as defined in RFC 2396;
* that is, one of the ASCII characters 0-9, a-f, or A-F.
* </p>
*
* @param c to check for hex digit.
* @return true if it's allowed, false otherwise.
*/
public static boolean isHexDigit(char c) {
// I suspect most characters passed to this method will be
// correct hexadecimal digits, so I test for the true cases
// first. If this proves to be a performance bottleneck
// a switch statement or lookup table
// might optimize this.
if (c >= '0' && c <= '9') return true;
if (c >= 'A' && c <= 'F') return true;
if (c >= 'a' && c <= 'f') return true;
return false;
}
/**
* <p>
* This is a utility function for determining whether
* a specified Unicode character is legal in URI references
* as determined by RFC 2396.
* </p>
*
* @param c <code>char</code> to check for URI reference compliance.
* @return true if it's allowed, false otherwise.
*/
public static boolean isURICharacter(char c) {
if (c >= 'a' && c <= 'z') return true;
if (c >= 'A' && c <= 'Z') return true;
if (c >= '0' && c <= '9') return true;
if (c == '/') return true;
if (c == '-') return true;
if (c == '.') return true;
if (c == '?') return true;
if (c == ':') return true;
if (c == '@') return true;
if (c == '&') return true;
if (c == '=') return true;
if (c == '+') return true;
if (c == '$') return true;
if (c == ',') return true;
if (c == '%') return true;
if (c == '_') return true;
if (c == '!') return true;
if (c == '~') return true;
if (c == '*') return true;
if (c == '\'') return true;
if (c == '(') return true;
if (c == ')') return true;
return false;
}
/**
* This is a utility function for determining whether a specified
* character is a character according to production 2 of the
* XML 1.0 specification.
*
* @param c <code>char</code> to check for XML compliance
* @return <code>boolean</code> true if it's a character,
* false otherwise
*/
public static boolean isXMLCharacter(int c) {
if (c == '\n') return true;
if (c == '\r') return true;
if (c == '\t') return true;
if (c < 0x20) return false; if (c <= 0xD7FF) return true;
if (c < 0xE000) return false; if (c <= 0xFFFD) return true;
if (c < 0x10000) return false; if (c <= 0x10FFFF) return true;
return false;
}
/**
* This is a utility function for determining whether a specified
* character is a name character according to production 4 of the
* XML 1.0 specification.
*
* @param c <code>char</code> to check for XML name compliance.
* @return <code>boolean</code> true if it's a name character,
* false otherwise.
*/
public static boolean isXMLNameCharacter(char c) {
return (isXMLLetter(c) || isXMLDigit(c) || c == '.' || c == '-'
|| c == '_' || c == ':' || isXMLCombiningChar(c)
|| isXMLExtender(c));
}
/**
* This is a utility function for determining whether a specified
* character is a legal name start character according to production 5
* of the XML 1.0 specification. This production does allow names
* to begin with colons which the Namespaces in XML Recommendation
* disallows.
*
* @param c <code>char</code> to check for XML name start compliance.
* @return <code>boolean</code> true if it's a name start character,
* false otherwise.
*/
public static boolean isXMLNameStartCharacter(char c) {
return (isXMLLetter(c) || c == '_' || c ==':');
}
/**
* This is a utility function for determining whether a specified
* character is a letter or digit according to productions 84 and 88
* of the XML 1.0 specification.
*
* @param c <code>char</code> to check.
* @return <code>boolean</code> true if it's letter or digit,
* false otherwise.
*/
public static boolean isXMLLetterOrDigit(char c) {
return (isXMLLetter(c) || isXMLDigit(c));
}
/**
* This is a utility function for determining whether a specified character
* is a letter according to production 84 of the XML 1.0 specification.
*
* @param c <code>char</code> to check for XML name compliance.
* @return <code>String</code> true if it's a letter, false otherwise.
*/
public static boolean isXMLLetter(char c) {
// Note that order is very important here. The search proceeds
// from lowest to highest values, so that no searching occurs
// above the character's value. BTW, the first line is equivalent to:
// if (c >= 0x0041 && c <= 0x005A) return true;
if (c < 0x0041) return false; if (c <= 0x005a) return true;
if (c < 0x0061) return false; if (c <= 0x007A) return true;
if (c < 0x00C0) return false; if (c <= 0x00D6) return true;
if (c < 0x00D8) return false; if (c <= 0x00F6) return true;
if (c < 0x00F8) return false; if (c <= 0x00FF) return true;
if (c < 0x0100) return false; if (c <= 0x0131) return true;
if (c < 0x0134) return false; if (c <= 0x013E) return true;
if (c < 0x0141) return false; if (c <= 0x0148) return true;
if (c < 0x014A) return false; if (c <= 0x017E) return true;
if (c < 0x0180) return false; if (c <= 0x01C3) return true;
if (c < 0x01CD) return false; if (c <= 0x01F0) return true;
if (c < 0x01F4) return false; if (c <= 0x01F5) return true;
if (c < 0x01FA) return false; if (c <= 0x0217) return true;
if (c < 0x0250) return false; if (c <= 0x02A8) return true;
if (c < 0x02BB) return false; if (c <= 0x02C1) return true;
if (c == 0x0386) return true;
if (c < 0x0388) return false; if (c <= 0x038A) return true;
if (c == 0x038C) return true;
if (c < 0x038E) return false; if (c <= 0x03A1) return true;
if (c < 0x03A3) return false; if (c <= 0x03CE) return true;
if (c < 0x03D0) return false; if (c <= 0x03D6) return true;
if (c == 0x03DA) return true;
if (c == 0x03DC) return true;
if (c == 0x03DE) return true;
if (c == 0x03E0) return true;
if (c < 0x03E2) return false; if (c <= 0x03F3) return true;
if (c < 0x0401) return false; if (c <= 0x040C) return true;
if (c < 0x040E) return false; if (c <= 0x044F) return true;
if (c < 0x0451) return false; if (c <= 0x045C) return true;
if (c < 0x045E) return false; if (c <= 0x0481) return true;
if (c < 0x0490) return false; if (c <= 0x04C4) return true;
if (c < 0x04C7) return false; if (c <= 0x04C8) return true;
if (c < 0x04CB) return false; if (c <= 0x04CC) return true;
if (c < 0x04D0) return false; if (c <= 0x04EB) return true;
if (c < 0x04EE) return false; if (c <= 0x04F5) return true;
if (c < 0x04F8) return false; if (c <= 0x04F9) return true;
if (c < 0x0531) return false; if (c <= 0x0556) return true;
if (c == 0x0559) return true;
if (c < 0x0561) return false; if (c <= 0x0586) return true;
if (c < 0x05D0) return false; if (c <= 0x05EA) return true;
if (c < 0x05F0) return false; if (c <= 0x05F2) return true;
if (c < 0x0621) return false; if (c <= 0x063A) return true;
if (c < 0x0641) return false; if (c <= 0x064A) return true;
if (c < 0x0671) return false; if (c <= 0x06B7) return true;
if (c < 0x06BA) return false; if (c <= 0x06BE) return true;
if (c < 0x06C0) return false; if (c <= 0x06CE) return true;
if (c < 0x06D0) return false; if (c <= 0x06D3) return true;
if (c == 0x06D5) return true;
if (c < 0x06E5) return false; if (c <= 0x06E6) return true;
if (c < 0x0905) return false; if (c <= 0x0939) return true;
if (c == 0x093D) return true;
if (c < 0x0958) return false; if (c <= 0x0961) return true;
if (c < 0x0985) return false; if (c <= 0x098C) return true;
if (c < 0x098F) return false; if (c <= 0x0990) return true;
if (c < 0x0993) return false; if (c <= 0x09A8) return true;
if (c < 0x09AA) return false; if (c <= 0x09B0) return true;
if (c == 0x09B2) return true;
if (c < 0x09B6) return false; if (c <= 0x09B9) return true;
if (c < 0x09DC) return false; if (c <= 0x09DD) return true;
if (c < 0x09DF) return false; if (c <= 0x09E1) return true;
if (c < 0x09F0) return false; if (c <= 0x09F1) return true;
if (c < 0x0A05) return false; if (c <= 0x0A0A) return true;
if (c < 0x0A0F) return false; if (c <= 0x0A10) return true;
if (c < 0x0A13) return false; if (c <= 0x0A28) return true;
if (c < 0x0A2A) return false; if (c <= 0x0A30) return true;
if (c < 0x0A32) return false; if (c <= 0x0A33) return true;
if (c < 0x0A35) return false; if (c <= 0x0A36) return true;
if (c < 0x0A38) return false; if (c <= 0x0A39) return true;
if (c < 0x0A59) return false; if (c <= 0x0A5C) return true;
if (c == 0x0A5E) return true;
if (c < 0x0A72) return false; if (c <= 0x0A74) return true;
if (c < 0x0A85) return false; if (c <= 0x0A8B) return true;
if (c == 0x0A8D) return true;
if (c < 0x0A8F) return false; if (c <= 0x0A91) return true;
if (c < 0x0A93) return false; if (c <= 0x0AA8) return true;
if (c < 0x0AAA) return false; if (c <= 0x0AB0) return true;
if (c < 0x0AB2) return false; if (c <= 0x0AB3) return true;
if (c < 0x0AB5) return false; if (c <= 0x0AB9) return true;
if (c == 0x0ABD) return true;
if (c == 0x0AE0) return true;
if (c < 0x0B05) return false; if (c <= 0x0B0C) return true;
if (c < 0x0B0F) return false; if (c <= 0x0B10) return true;
if (c < 0x0B13) return false; if (c <= 0x0B28) return true;
if (c < 0x0B2A) return false; if (c <= 0x0B30) return true;
if (c < 0x0B32) return false; if (c <= 0x0B33) return true;
if (c < 0x0B36) return false; if (c <= 0x0B39) return true;
if (c == 0x0B3D) return true;
if (c < 0x0B5C) return false; if (c <= 0x0B5D) return true;
if (c < 0x0B5F) return false; if (c <= 0x0B61) return true;
if (c < 0x0B85) return false; if (c <= 0x0B8A) return true;
if (c < 0x0B8E) return false; if (c <= 0x0B90) return true;
if (c < 0x0B92) return false; if (c <= 0x0B95) return true;
if (c < 0x0B99) return false; if (c <= 0x0B9A) return true;
if (c == 0x0B9C) return true;
if (c < 0x0B9E) return false; if (c <= 0x0B9F) return true;
if (c < 0x0BA3) return false; if (c <= 0x0BA4) return true;
if (c < 0x0BA8) return false; if (c <= 0x0BAA) return true;
if (c < 0x0BAE) return false; if (c <= 0x0BB5) return true;
if (c < 0x0BB7) return false; if (c <= 0x0BB9) return true;
if (c < 0x0C05) return false; if (c <= 0x0C0C) return true;
if (c < 0x0C0E) return false; if (c <= 0x0C10) return true;
if (c < 0x0C12) return false; if (c <= 0x0C28) return true;
if (c < 0x0C2A) return false; if (c <= 0x0C33) return true;
if (c < 0x0C35) return false; if (c <= 0x0C39) return true;
if (c < 0x0C60) return false; if (c <= 0x0C61) return true;
if (c < 0x0C85) return false; if (c <= 0x0C8C) return true;
if (c < 0x0C8E) return false; if (c <= 0x0C90) return true;
if (c < 0x0C92) return false; if (c <= 0x0CA8) return true;
if (c < 0x0CAA) return false; if (c <= 0x0CB3) return true;
if (c < 0x0CB5) return false; if (c <= 0x0CB9) return true;
if (c == 0x0CDE) return true;
if (c < 0x0CE0) return false; if (c <= 0x0CE1) return true;
if (c < 0x0D05) return false; if (c <= 0x0D0C) return true;
if (c < 0x0D0E) return false; if (c <= 0x0D10) return true;
if (c < 0x0D12) return false; if (c <= 0x0D28) return true;
if (c < 0x0D2A) return false; if (c <= 0x0D39) return true;
if (c < 0x0D60) return false; if (c <= 0x0D61) return true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -