mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-13 08:53:20 +00:00
ArabicShaping
X-SVN-Rev: 3666
This commit is contained in:
parent
e51eb6153f
commit
4f1c21c090
2 changed files with 570 additions and 0 deletions
icu4j/src/com/ibm/icu
285
icu4j/src/com/ibm/icu/dev/test/shaping/ArabicShapingTest.java
Executable file
285
icu4j/src/com/ibm/icu/dev/test/shaping/ArabicShapingTest.java
Executable file
|
@ -0,0 +1,285 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2001, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
package com.ibm.icu.test.text;
|
||||
|
||||
import com.ibm.icu.text.ArabicShaping;
|
||||
import com.ibm.icu.text.ArabicShapingException;
|
||||
|
||||
/**
|
||||
* Interactive test for Arabic shaping.
|
||||
* Invoke from a command line passing args and strings. Use '-help' to see description of arguments.
|
||||
*/
|
||||
public class ArabicShapingTest {
|
||||
private static final int COPY = 0;
|
||||
private static final int INPLACE = 1;
|
||||
private static final int STRING = 2;
|
||||
|
||||
public static final void main(String[] args) {
|
||||
int testtype = COPY;
|
||||
int options = 0;
|
||||
int ss = 0;
|
||||
int sl = -1;
|
||||
int ds = 0;
|
||||
int dl = -1;
|
||||
String text = "$22.4 test 123 \ufef6\u0644\u0622 456 \u0664\u0665\u0666!";
|
||||
|
||||
for (int i = 0; i < args.length; ++i) {
|
||||
String arg = args[i];
|
||||
if (arg.charAt(0) == '-') {
|
||||
String opt = arg.substring(1);
|
||||
String val = opt;
|
||||
int index = arg.indexOf(':');
|
||||
if (index != -1) {
|
||||
opt = opt.substring(0, Math.min(index, 3));
|
||||
val = arg.substring(index + 1);
|
||||
}
|
||||
|
||||
if (opt.equalsIgnoreCase("len")) {
|
||||
options &= ~ArabicShaping.LENGTH_MASK;
|
||||
if (val.equalsIgnoreCase("gs")) {
|
||||
options |= ArabicShaping.LENGTH_GROW_SHRINK;
|
||||
} else if (val.equalsIgnoreCase("sn")) {
|
||||
options |= ArabicShaping.LENGTH_FIXED_SPACES_NEAR;
|
||||
} else if (val.equalsIgnoreCase("se")) {
|
||||
options |= ArabicShaping.LENGTH_FIXED_SPACES_AT_END;
|
||||
} else if (val.equalsIgnoreCase("sb")) {
|
||||
options |= ArabicShaping.LENGTH_FIXED_SPACES_AT_BEGINNING;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dir")) {
|
||||
options &= ~ArabicShaping.TEXT_DIRECTION_MASK;
|
||||
if (val.equalsIgnoreCase("log")) {
|
||||
options |= ArabicShaping.TEXT_DIRECTION_LOGICAL;
|
||||
} else if (val.equalsIgnoreCase("vis")) {
|
||||
options |= ArabicShaping.TEXT_DIRECTION_VISUAL_LTR;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("let")) {
|
||||
options &= ~ArabicShaping.LETTERS_MASK;
|
||||
if (val.equalsIgnoreCase("no")) {
|
||||
options |= ArabicShaping.LETTERS_NOOP;
|
||||
} else if (val.equalsIgnoreCase("sh")) {
|
||||
options |= ArabicShaping.LETTERS_SHAPE;
|
||||
} else if (val.equalsIgnoreCase("un")) {
|
||||
options |= ArabicShaping.LETTERS_UNSHAPE;
|
||||
} else if (val.equalsIgnoreCase("ta")) {
|
||||
options |= ArabicShaping.LETTERS_SHAPE_EXCEPT_TASHKEEL;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dig")) {
|
||||
options &= ~ArabicShaping.DIGITS_MASK;
|
||||
if (val.equalsIgnoreCase("no")) {
|
||||
options |= ArabicShaping.DIGITS_NOOP;
|
||||
} else if (val.equalsIgnoreCase("ea")) {
|
||||
options |= ArabicShaping.DIGITS_EN2AN;
|
||||
} else if (val.equalsIgnoreCase("ae")) {
|
||||
options |= ArabicShaping.DIGITS_AN2EN;
|
||||
} else if (val.equalsIgnoreCase("lr")) {
|
||||
options |= ArabicShaping.DIGITS_EN2AN_INIT_LR;
|
||||
} else if (val.equalsIgnoreCase("al")) {
|
||||
options |= ArabicShaping.DIGITS_EN2AN_INIT_AL;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("typ")) {
|
||||
options &= ~ArabicShaping.DIGIT_TYPE_MASK;
|
||||
if (val.equalsIgnoreCase("an")) {
|
||||
options |= ArabicShaping.DIGIT_TYPE_AN;
|
||||
} else if (val.equalsIgnoreCase("ex")) {
|
||||
options |= ArabicShaping.DIGIT_TYPE_AN_EXTENDED;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dst")) {
|
||||
try {
|
||||
ds = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dln")) {
|
||||
try {
|
||||
dl = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("sst")) {
|
||||
try {
|
||||
ss = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("sln")) {
|
||||
try {
|
||||
sl = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("tes")) {
|
||||
if (val.equalsIgnoreCase("cp")) {
|
||||
testtype = COPY;
|
||||
} else if (val.equalsIgnoreCase("ip")) {
|
||||
testtype = INPLACE;
|
||||
} else if (val.equalsIgnoreCase("st")) {
|
||||
testtype = STRING;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("help")) {
|
||||
System.out.println(usage);
|
||||
} else {
|
||||
throwOptError(opt);
|
||||
}
|
||||
} else {
|
||||
// assume text
|
||||
text = parseText(arg);
|
||||
}
|
||||
}
|
||||
|
||||
if (sl < 0) {
|
||||
sl = text.length() - ss;
|
||||
System.out.println("sl defaulting to " + sl);
|
||||
}
|
||||
if (dl < 0) {
|
||||
dl = 2 * sl;
|
||||
System.out.println("dl defaulting to " + dl);
|
||||
}
|
||||
|
||||
ArabicShaping shaper = new ArabicShaping(options);
|
||||
System.out.println("shaper: " + shaper);
|
||||
|
||||
char[] src = text.toCharArray();
|
||||
System.out.println(" input: '" + escapedText(src, ss, sl) + "'");
|
||||
if (testtype != STRING) {
|
||||
System.out.println("start: " + ss + " length: " + sl + " total length: " + src.length);
|
||||
}
|
||||
|
||||
int result = -1;
|
||||
char[] dest = null;
|
||||
|
||||
try {
|
||||
switch (testtype) {
|
||||
case COPY:
|
||||
dest = new char[ds + dl];
|
||||
result = shaper.shape(src, ss, sl, dest, ds, dl);
|
||||
break;
|
||||
|
||||
case INPLACE:
|
||||
shaper.shape(src, ss, sl);
|
||||
ds = ss;
|
||||
result = sl;
|
||||
dest = src;
|
||||
break;
|
||||
|
||||
case STRING:
|
||||
dest = shaper.shape(text).toCharArray();
|
||||
ds = 0;
|
||||
result = dest.length;
|
||||
break;
|
||||
}
|
||||
|
||||
System.out.println("output: '" + escapedText(dest, ds, result) + "'");
|
||||
System.out.println("length: " + result);
|
||||
if (ds != 0 || result != dest.length) {
|
||||
System.out.println("full output: '" + escapedText(dest, 0, dest.length) + "'");
|
||||
}
|
||||
}
|
||||
catch (ArabicShapingException e) {
|
||||
System.out.println("Caught ArabicShapingException");
|
||||
System.out.println(e);
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println("Caught Exception");
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void throwOptError(String opt) {
|
||||
throwUsageError("unknown option: " + opt);
|
||||
}
|
||||
|
||||
private static void throwValError(String opt, String val) {
|
||||
throwUsageError("unknown value: " + val + " for option: " + opt);
|
||||
}
|
||||
|
||||
private static void throwUsageError(String message) {
|
||||
StringBuffer buf = new StringBuffer("*** usage error ***\n");
|
||||
buf.append(message);
|
||||
buf.append("\n");
|
||||
buf.append(usage);
|
||||
throw new Error(buf.toString());
|
||||
}
|
||||
|
||||
private static final String usage =
|
||||
"Usage: [option]* [text]\n" +
|
||||
" where option is in the format '-opt[:val]'\n" +
|
||||
" options are:\n" +
|
||||
" -len:[gs|sn|se|sb] (length: grow/shrink, spaces near, spaces end, spaces beginning)\n" +
|
||||
" -dir:[log|vis] (direction: logical, visual)\n" +
|
||||
" -let:[no|sh|un|ta] (letters: noop, shape, unshape, tashkeel)\n" +
|
||||
" -dig:[no|ea|ae|lr|al] (digits: noop, en2an, an2en, en2an_lr, en2an_al)\n" +
|
||||
" -typ:[an|ex] (digit type: arabic, arabic extended)\n" +
|
||||
" -dst:# (dest start: [integer])\n" +
|
||||
" -dln:# (dest length (max size): [integer])\n" +
|
||||
" -sst:# (source start: [integer])\n" +
|
||||
" -sln:# (source length: [integer])\n" +
|
||||
" -tes:[cp|ip|st] (test type: copy, in place, string)\n" +
|
||||
" -help (print this help message)\n" +
|
||||
" text can contain unicode escape values in the format '\\uXXXX' only\n";
|
||||
|
||||
private static String escapedText(char[] text, int start, int length) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = start, e = start + length; i < e; ++i) {
|
||||
char ch = text[i];
|
||||
if (ch < 0x20 || ch > 0x7e) {
|
||||
buf.append("\\u");
|
||||
if (ch < 0x1000) {
|
||||
buf.append('0');
|
||||
}
|
||||
if (ch < 0x100) {
|
||||
buf.append('0');
|
||||
}
|
||||
if (ch < 0x10) {
|
||||
buf.append('0');
|
||||
}
|
||||
buf.append(Integer.toHexString(ch));
|
||||
} else {
|
||||
buf.append(ch);
|
||||
}
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static String parseText(String text) {
|
||||
// process unicode escapes (only)
|
||||
StringBuffer buf = new StringBuffer();
|
||||
char[] chars = text.toCharArray();
|
||||
for (int i = 0; i < chars.length; ++i) {
|
||||
char ch = chars[i];
|
||||
if (ch == '\\') {
|
||||
if ((i < chars.length - 1) &&
|
||||
(chars[i+1] == 'u')) {
|
||||
int val = Integer.parseInt(text.substring(i+2, i+6), 16);
|
||||
buf.append((char)val);
|
||||
i += 5;
|
||||
} else {
|
||||
buf.append('\\');
|
||||
}
|
||||
} else {
|
||||
buf.append(ch);
|
||||
}
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
285
icu4j/src/com/ibm/icu/test/text/ArabicShapingTest.java
Executable file
285
icu4j/src/com/ibm/icu/test/text/ArabicShapingTest.java
Executable file
|
@ -0,0 +1,285 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2001, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
package com.ibm.icu.test.text;
|
||||
|
||||
import com.ibm.icu.text.ArabicShaping;
|
||||
import com.ibm.icu.text.ArabicShapingException;
|
||||
|
||||
/**
|
||||
* Interactive test for Arabic shaping.
|
||||
* Invoke from a command line passing args and strings. Use '-help' to see description of arguments.
|
||||
*/
|
||||
public class ArabicShapingTest {
|
||||
private static final int COPY = 0;
|
||||
private static final int INPLACE = 1;
|
||||
private static final int STRING = 2;
|
||||
|
||||
public static final void main(String[] args) {
|
||||
int testtype = COPY;
|
||||
int options = 0;
|
||||
int ss = 0;
|
||||
int sl = -1;
|
||||
int ds = 0;
|
||||
int dl = -1;
|
||||
String text = "$22.4 test 123 \ufef6\u0644\u0622 456 \u0664\u0665\u0666!";
|
||||
|
||||
for (int i = 0; i < args.length; ++i) {
|
||||
String arg = args[i];
|
||||
if (arg.charAt(0) == '-') {
|
||||
String opt = arg.substring(1);
|
||||
String val = opt;
|
||||
int index = arg.indexOf(':');
|
||||
if (index != -1) {
|
||||
opt = opt.substring(0, Math.min(index, 3));
|
||||
val = arg.substring(index + 1);
|
||||
}
|
||||
|
||||
if (opt.equalsIgnoreCase("len")) {
|
||||
options &= ~ArabicShaping.LENGTH_MASK;
|
||||
if (val.equalsIgnoreCase("gs")) {
|
||||
options |= ArabicShaping.LENGTH_GROW_SHRINK;
|
||||
} else if (val.equalsIgnoreCase("sn")) {
|
||||
options |= ArabicShaping.LENGTH_FIXED_SPACES_NEAR;
|
||||
} else if (val.equalsIgnoreCase("se")) {
|
||||
options |= ArabicShaping.LENGTH_FIXED_SPACES_AT_END;
|
||||
} else if (val.equalsIgnoreCase("sb")) {
|
||||
options |= ArabicShaping.LENGTH_FIXED_SPACES_AT_BEGINNING;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dir")) {
|
||||
options &= ~ArabicShaping.TEXT_DIRECTION_MASK;
|
||||
if (val.equalsIgnoreCase("log")) {
|
||||
options |= ArabicShaping.TEXT_DIRECTION_LOGICAL;
|
||||
} else if (val.equalsIgnoreCase("vis")) {
|
||||
options |= ArabicShaping.TEXT_DIRECTION_VISUAL_LTR;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("let")) {
|
||||
options &= ~ArabicShaping.LETTERS_MASK;
|
||||
if (val.equalsIgnoreCase("no")) {
|
||||
options |= ArabicShaping.LETTERS_NOOP;
|
||||
} else if (val.equalsIgnoreCase("sh")) {
|
||||
options |= ArabicShaping.LETTERS_SHAPE;
|
||||
} else if (val.equalsIgnoreCase("un")) {
|
||||
options |= ArabicShaping.LETTERS_UNSHAPE;
|
||||
} else if (val.equalsIgnoreCase("ta")) {
|
||||
options |= ArabicShaping.LETTERS_SHAPE_EXCEPT_TASHKEEL;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dig")) {
|
||||
options &= ~ArabicShaping.DIGITS_MASK;
|
||||
if (val.equalsIgnoreCase("no")) {
|
||||
options |= ArabicShaping.DIGITS_NOOP;
|
||||
} else if (val.equalsIgnoreCase("ea")) {
|
||||
options |= ArabicShaping.DIGITS_EN2AN;
|
||||
} else if (val.equalsIgnoreCase("ae")) {
|
||||
options |= ArabicShaping.DIGITS_AN2EN;
|
||||
} else if (val.equalsIgnoreCase("lr")) {
|
||||
options |= ArabicShaping.DIGITS_EN2AN_INIT_LR;
|
||||
} else if (val.equalsIgnoreCase("al")) {
|
||||
options |= ArabicShaping.DIGITS_EN2AN_INIT_AL;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("typ")) {
|
||||
options &= ~ArabicShaping.DIGIT_TYPE_MASK;
|
||||
if (val.equalsIgnoreCase("an")) {
|
||||
options |= ArabicShaping.DIGIT_TYPE_AN;
|
||||
} else if (val.equalsIgnoreCase("ex")) {
|
||||
options |= ArabicShaping.DIGIT_TYPE_AN_EXTENDED;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dst")) {
|
||||
try {
|
||||
ds = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("dln")) {
|
||||
try {
|
||||
dl = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("sst")) {
|
||||
try {
|
||||
ss = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("sln")) {
|
||||
try {
|
||||
sl = Integer.parseInt(val);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("tes")) {
|
||||
if (val.equalsIgnoreCase("cp")) {
|
||||
testtype = COPY;
|
||||
} else if (val.equalsIgnoreCase("ip")) {
|
||||
testtype = INPLACE;
|
||||
} else if (val.equalsIgnoreCase("st")) {
|
||||
testtype = STRING;
|
||||
} else {
|
||||
throwValError(opt, val);
|
||||
}
|
||||
} else if (opt.equalsIgnoreCase("help")) {
|
||||
System.out.println(usage);
|
||||
} else {
|
||||
throwOptError(opt);
|
||||
}
|
||||
} else {
|
||||
// assume text
|
||||
text = parseText(arg);
|
||||
}
|
||||
}
|
||||
|
||||
if (sl < 0) {
|
||||
sl = text.length() - ss;
|
||||
System.out.println("sl defaulting to " + sl);
|
||||
}
|
||||
if (dl < 0) {
|
||||
dl = 2 * sl;
|
||||
System.out.println("dl defaulting to " + dl);
|
||||
}
|
||||
|
||||
ArabicShaping shaper = new ArabicShaping(options);
|
||||
System.out.println("shaper: " + shaper);
|
||||
|
||||
char[] src = text.toCharArray();
|
||||
System.out.println(" input: '" + escapedText(src, ss, sl) + "'");
|
||||
if (testtype != STRING) {
|
||||
System.out.println("start: " + ss + " length: " + sl + " total length: " + src.length);
|
||||
}
|
||||
|
||||
int result = -1;
|
||||
char[] dest = null;
|
||||
|
||||
try {
|
||||
switch (testtype) {
|
||||
case COPY:
|
||||
dest = new char[ds + dl];
|
||||
result = shaper.shape(src, ss, sl, dest, ds, dl);
|
||||
break;
|
||||
|
||||
case INPLACE:
|
||||
shaper.shape(src, ss, sl);
|
||||
ds = ss;
|
||||
result = sl;
|
||||
dest = src;
|
||||
break;
|
||||
|
||||
case STRING:
|
||||
dest = shaper.shape(text).toCharArray();
|
||||
ds = 0;
|
||||
result = dest.length;
|
||||
break;
|
||||
}
|
||||
|
||||
System.out.println("output: '" + escapedText(dest, ds, result) + "'");
|
||||
System.out.println("length: " + result);
|
||||
if (ds != 0 || result != dest.length) {
|
||||
System.out.println("full output: '" + escapedText(dest, 0, dest.length) + "'");
|
||||
}
|
||||
}
|
||||
catch (ArabicShapingException e) {
|
||||
System.out.println("Caught ArabicShapingException");
|
||||
System.out.println(e);
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println("Caught Exception");
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void throwOptError(String opt) {
|
||||
throwUsageError("unknown option: " + opt);
|
||||
}
|
||||
|
||||
private static void throwValError(String opt, String val) {
|
||||
throwUsageError("unknown value: " + val + " for option: " + opt);
|
||||
}
|
||||
|
||||
private static void throwUsageError(String message) {
|
||||
StringBuffer buf = new StringBuffer("*** usage error ***\n");
|
||||
buf.append(message);
|
||||
buf.append("\n");
|
||||
buf.append(usage);
|
||||
throw new Error(buf.toString());
|
||||
}
|
||||
|
||||
private static final String usage =
|
||||
"Usage: [option]* [text]\n" +
|
||||
" where option is in the format '-opt[:val]'\n" +
|
||||
" options are:\n" +
|
||||
" -len:[gs|sn|se|sb] (length: grow/shrink, spaces near, spaces end, spaces beginning)\n" +
|
||||
" -dir:[log|vis] (direction: logical, visual)\n" +
|
||||
" -let:[no|sh|un|ta] (letters: noop, shape, unshape, tashkeel)\n" +
|
||||
" -dig:[no|ea|ae|lr|al] (digits: noop, en2an, an2en, en2an_lr, en2an_al)\n" +
|
||||
" -typ:[an|ex] (digit type: arabic, arabic extended)\n" +
|
||||
" -dst:# (dest start: [integer])\n" +
|
||||
" -dln:# (dest length (max size): [integer])\n" +
|
||||
" -sst:# (source start: [integer])\n" +
|
||||
" -sln:# (source length: [integer])\n" +
|
||||
" -tes:[cp|ip|st] (test type: copy, in place, string)\n" +
|
||||
" -help (print this help message)\n" +
|
||||
" text can contain unicode escape values in the format '\\uXXXX' only\n";
|
||||
|
||||
private static String escapedText(char[] text, int start, int length) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = start, e = start + length; i < e; ++i) {
|
||||
char ch = text[i];
|
||||
if (ch < 0x20 || ch > 0x7e) {
|
||||
buf.append("\\u");
|
||||
if (ch < 0x1000) {
|
||||
buf.append('0');
|
||||
}
|
||||
if (ch < 0x100) {
|
||||
buf.append('0');
|
||||
}
|
||||
if (ch < 0x10) {
|
||||
buf.append('0');
|
||||
}
|
||||
buf.append(Integer.toHexString(ch));
|
||||
} else {
|
||||
buf.append(ch);
|
||||
}
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static String parseText(String text) {
|
||||
// process unicode escapes (only)
|
||||
StringBuffer buf = new StringBuffer();
|
||||
char[] chars = text.toCharArray();
|
||||
for (int i = 0; i < chars.length; ++i) {
|
||||
char ch = chars[i];
|
||||
if (ch == '\\') {
|
||||
if ((i < chars.length - 1) &&
|
||||
(chars[i+1] == 'u')) {
|
||||
int val = Integer.parseInt(text.substring(i+2, i+6), 16);
|
||||
buf.append((char)val);
|
||||
i += 5;
|
||||
} else {
|
||||
buf.append('\\');
|
||||
}
|
||||
} else {
|
||||
buf.append(ch);
|
||||
}
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue