| package com.sun.org.apache.xml.internal.security.c14n.implementations; |
| |
| import java.io.IOException; |
| import java.io.OutputStream; |
| import java.util.Map; |
| |
| public class UtfHelpper { |
| |
| final static void writeByte(final String str,final OutputStream out,Map cache) throws IOException { |
| byte []result=(byte[]) cache.get(str); |
| if (result==null) { |
| result=getStringInUtf8(str); |
| cache.put(str,result); |
| } |
| |
| out.write(result); |
| |
| } |
| |
| final static void writeCharToUtf8(final char c,final OutputStream out) throws IOException{ |
| if (c < 0x80) { |
| out.write(c); |
| return; |
| } |
| if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){ |
| //No Surrogates in sun java |
| out.write(0x3f); |
| return; |
| } |
| int bias; |
| int write; |
| char ch; |
| if (c > 0x07FF) { |
| ch=(char)(c>>>12); |
| write=0xE0; |
| if (ch>0) { |
| write |= ( ch & 0x0F); |
| } |
| out.write(write); |
| write=0x80; |
| bias=0x3F; |
| } else { |
| write=0xC0; |
| bias=0x1F; |
| } |
| ch=(char)(c>>>6); |
| if (ch>0) { |
| write|= (ch & bias); |
| } |
| out.write(write); |
| out.write(0x80 | ((c) & 0x3F)); |
| |
| } |
| |
| final static void writeStringToUtf8(final String str,final OutputStream out) throws IOException{ |
| final int length=str.length(); |
| int i=0; |
| char c; |
| while (i<length) { |
| c=str.charAt(i++); |
| if (c < 0x80) { |
| out.write(c); |
| continue; |
| } |
| if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){ |
| //No Surrogates in sun java |
| out.write(0x3f); |
| continue; |
| } |
| char ch; |
| int bias; |
| int write; |
| if (c > 0x07FF) { |
| ch=(char)(c>>>12); |
| write=0xE0; |
| if (ch>0) { |
| write |= ( ch & 0x0F); |
| } |
| out.write(write); |
| write=0x80; |
| bias=0x3F; |
| } else { |
| write=0xC0; |
| bias=0x1F; |
| } |
| ch=(char)(c>>>6); |
| if (ch>0) { |
| write|= (ch & bias); |
| } |
| out.write(write); |
| out.write(0x80 | ((c) & 0x3F)); |
| |
| } |
| |
| } |
| public final static byte[] getStringInUtf8(final String str) { |
| final int length=str.length(); |
| boolean expanded=false; |
| byte []result=new byte[length]; |
| int i=0; |
| int out=0; |
| char c; |
| while (i<length) { |
| c=str.charAt(i++); |
| if ( c < 0x80 ) { |
| result[out++]=(byte)c; |
| continue; |
| } |
| if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){ |
| //No Surrogates in sun java |
| result[out++]=0x3f; |
| |
| continue; |
| } |
| if (!expanded) { |
| byte newResult[]=new byte[3*length]; |
| System.arraycopy(result, 0, newResult, 0, out); |
| result=newResult; |
| expanded=true; |
| } |
| char ch; |
| int bias; |
| byte write; |
| if (c > 0x07FF) { |
| ch=(char)(c>>>12); |
| write=(byte)0xE0; |
| if (ch>0) { |
| write |= ( ch & 0x0F); |
| } |
| result[out++]=write; |
| write=(byte)0x80; |
| bias=0x3F; |
| } else { |
| write=(byte)0xC0; |
| bias=0x1F; |
| } |
| ch=(char)(c>>>6); |
| if (ch>0) { |
| write|= (ch & bias); |
| } |
| result[out++]=write; |
| result[out++]=(byte)(0x80 | ((c) & 0x3F));/**/ |
| |
| } |
| if (expanded) { |
| byte newResult[]=new byte[out]; |
| System.arraycopy(result, 0, newResult, 0, out); |
| result=newResult; |
| } |
| return result; |
| } |
| |
| |
| |
| } |