1 package build.tools.generatecharacter; 2 3 import java.io.*; 4 import java.nio.*; 5 import java.util.*; 6 import java.util.zip.*; 7 8 public class CharacterName { 9 10 public static void main(String[] args) { 11 FileReader reader = null; 12 try { 13 if (args.length != 2) { 14 System.err.println("Usage: java CharacterName UniocdeData.txt uniName.dat"); 15 System.exit(1); 16 } 17 18 reader = new FileReader(args[0]); 19 BufferedReader bfr = new BufferedReader(reader); 20 String line = null; 21 22 StringBuilder namePool = new StringBuilder(); 23 byte[] cpPoolBytes = new byte[0x100000]; 24 ByteBuffer cpBB = ByteBuffer.wrap(cpPoolBytes); 25 int lastCp = 0; 26 int cpNum = 0; 27 28 while ((line = bfr.readLine()) != null) { 29 if (line.startsWith("#")) 30 continue; 31 UnicodeSpec spec = UnicodeSpec.parse(line); 32 if (spec != null) { 33 int cp = spec.getCodePoint(); 34 String name = spec.getName(); 35 cpNum++; 36 if (name.equals("<control>") && spec.getOldName() != null) { 37 if (spec.getOldName().length() != 0) 38 name = spec.getOldName(); 39 else 40 continue; 41 } else if (name.startsWith("<")) { 42 /* 43 3400 <CJK Ideograph Extension A, First> 44 4db5 <CJK Ideograph Extension A, Last> 45 4e00 <CJK Ideograph, First> 46 9fc3 <CJK Ideograph, Last> 47 ac00 <Hangul Syllable, First> 48 d7a3 <Hangul Syllable, Last> 49 d800 <Non Private Use High Surrogate, First> 50 db7f <Non Private Use High Surrogate, Last> 51 db80 <Private Use High Surrogate, First> 52 dbff <Private Use High Surrogate, Last> 53 dc00 <Low Surrogate, First> 54 dfff <Low Surrogate, Last> 55 e000 <Private Use, First> 56 f8ff <Private Use, Last> 57 20000 <CJK Ideograph Extension B, First> 58 2a6d6 <CJK Ideograph Extension B, Last> 59 f0000 <Plane 15 Private Use, First> 60 ffffd <Plane 15 Private Use, Last> 61 */ 62 continue; 63 } 64 65 if (cp == lastCp + 1) { 66 cpBB.put((byte)name.length()); 67 } else { 68 cpBB.put((byte)0); // segment start flag 69 cpBB.putInt((name.length() << 24) | (cp & 0xffffff)); 70 } 71 namePool.append(name); 72 lastCp = cp; 73 } 74 } 75 76 byte[] namePoolBytes = namePool.toString().getBytes("ASCII"); 77 int cpLen = cpBB.position(); 78 int total = cpLen + namePoolBytes.length; 79 80 DataOutputStream dos = new DataOutputStream( 81 new DeflaterOutputStream( 82 new FileOutputStream(args[1]))); 83 dos.writeInt(total); // total 84 dos.writeInt(cpLen); // nameOff 85 dos.write(cpPoolBytes, 0, cpLen); 86 dos.write(namePoolBytes); 87 dos.close(); 88 89 } catch (Throwable e) { 90 System.out.println("Unexpected exception:"); 91 e.printStackTrace(); 92 } finally { 93 if (reader != null) { 94 try { 95 reader.close(); 96 } catch (Throwable ee) { ee.printStackTrace(); } 97 } 98 } 99 } 100 }