Example usage for java.lang StringBuilder appendCodePoint

List of usage examples for java.lang StringBuilder appendCodePoint

Introduction

In this page you can find the example usage for java.lang StringBuilder appendCodePoint.

Prototype

@Override
public StringBuilder appendCodePoint(int codePoint) 

Source Link

Usage

From source file:XmlNameEncoder.java

/**
 * {@inheritDoc}/*from w  ww .jav  a 2 s.  c  o  m*/
 * 
 * @see org.jboss.dna.common.text.TextDecoder#decode(java.lang.String)
 */
public String decode(String encodedText) {
    if (encodedText == null)
        return null;
    if (encodedText.length() < 7) {
        // Not big enough to have an encoded sequence
        return encodedText;
    }
    StringBuilder sb = new StringBuilder();
    char[] digits = new char[4];
    CharacterIterator iter = new StringCharacterIterator(encodedText);
    for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
        if (c == '_') {
            // Read the next character, if there is one ...
            char next = iter.next();
            if (next == CharacterIterator.DONE) {
                sb.append(c);
                break;
            }
            // If the next character is not 'x', then these are just regular characters ...
            if (next != 'x') {
                sb.append(c).append(next);
                continue;
            }
            // Read the next 4 characters (digits) and another '_' character ...
            digits[0] = iter.next();
            if (digits[0] == CharacterIterator.DONE) {
                sb.append(c).append(next);
                break;
            }
            digits[1] = iter.next();
            if (digits[1] == CharacterIterator.DONE) {
                sb.append(c).append(next).append(digits, 0, 1);
                break;
            }
            digits[2] = iter.next();
            if (digits[2] == CharacterIterator.DONE) {
                sb.append(c).append(next).append(digits, 0, 2);
                break;
            }
            digits[3] = iter.next();
            if (digits[3] == CharacterIterator.DONE) {
                sb.append(c).append(next).append(digits, 0, 3);
                break;
            }
            char underscore = iter.next();
            if (underscore != '_') { // includes DONE
                sb.append(c).append(next).append(digits, 0, 4);
                if (underscore == CharacterIterator.DONE)
                    break;
                sb.append(underscore);
                continue;
            }
            // We've read all 4 digits, including the trailing '_'
            // Now parse into the resulting character
            try {
                sb.appendCodePoint(Integer.parseInt(new String(digits), 16));
            } catch (NumberFormatException e) {
                // code was not hexadecimal, so just write out the characters as is ...
                sb.append(c).append(next).append(digits).append(underscore);
            }
        } else {
            // Just append other characters ...
            sb.append(c);
        }
    }
    return sb.toString();
}