1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * https://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.lang3.text.translate; 18 19 import java.io.IOException; 20 import java.io.Writer; 21 22 /** 23 * Translates escaped Unicode values of the form \\u+\d\d\d\d back to 24 * Unicode. It supports multiple 'u' characters and will work with or 25 * without the +. 26 * 27 * @since 3.0 28 * @deprecated As of <a href="https://commons.apache.org/proper/commons-lang/changes-report.html#a3.6">3.6</a>, use Apache Commons Text 29 * <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/UnicodeUnescaper.html"> 30 * UnicodeUnescaper</a>. 31 */ 32 @Deprecated 33 public class UnicodeUnescaper extends CharSequenceTranslator { 34 35 /** 36 * Constructs a new instance. 37 */ 38 public UnicodeUnescaper() { 39 // empty 40 } 41 42 /** 43 * {@inheritDoc} 44 */ 45 @Override 46 public int translate(final CharSequence input, final int index, final Writer out) throws IOException { 47 if (input.charAt(index) == '\\' && index + 1 < input.length() && input.charAt(index + 1) == 'u') { 48 // consume optional additional 'u' chars 49 int i = 2; 50 while (index + i < input.length() && input.charAt(index + i) == 'u') { 51 i++; 52 } 53 54 if (index + i < input.length() && input.charAt(index + i) == '+') { 55 i++; 56 } 57 58 if (index + i + 4 <= input.length()) { 59 // Get 4 hex digits 60 final CharSequence unicode = input.subSequence(index + i, index + i + 4); 61 62 try { 63 final int value = Integer.parseInt(unicode.toString(), 16); 64 out.write((char) value); 65 } catch (final NumberFormatException nfe) { 66 throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe); 67 } 68 return i + 4; 69 } 70 throw new IllegalArgumentException("Less than 4 hex digits in unicode value: '" + input.subSequence(index, input.length()) 71 + "' due to end of CharSequence"); 72 } 73 return 0; 74 } 75 }