FileDocCategorySizeDatePackage
Encodings.javaAPI DocJava SE 5 API14635Fri Aug 26 14:56:02 BST 2005com.sun.org.apache.xml.internal.serializer

Encodings

public class Encodings extends Object
Provides information about encodings. Depends on the Java runtime to provides writers for the different encodings, but can be used to override encoding names and provide the last printable character for each encoding.
version
$Revision: 1.8 $ $Date: 2004/02/23 10:29:37 $
author
Assaf Arkin

Fields Summary
static final int
m_defaultLastPrintable
The last printable character for unknown encodings.
static final String
ENCODINGS_FILE
Standard filename for properties file with encodings data.
static final String
ENCODINGS_PROP
Standard filename for properties file with encodings data.
private static final Method
SUN_CHAR2BYTE_CONVERTER_METHOD
SUN JVM internal ByteToChar converter method
public static final String
DEFAULT_MIME_ENCODING
The default encoding, ISO style, ISO style.
private static final Hashtable
_encodingTableKeyJava
private static final Hashtable
_encodingTableKeyMime
private static final EncodingInfo[]
_encodings
Constructors Summary
Methods Summary
public static java.lang.StringconvertJava2MimeEncoding(java.lang.String encoding)
Try the best we can to convert a Java encoding to a XML-style encoding.

param
encoding non-null reference to encoding string, java style.
return
ISO-style encoding string.

        EncodingInfo enc =
            (EncodingInfo) _encodingTableKeyJava.get(encoding.toUpperCase());
        if (null != enc)
            return enc.name;
        return encoding;
    
public static java.lang.StringconvertMime2JavaEncoding(java.lang.String encoding)
Try the best we can to convert a Java encoding to a XML-style encoding.

param
encoding non-null reference to encoding string, java style.
return
ISO-style encoding string.


        for (int i = 0; i < _encodings.length; ++i)
        {
            if (_encodings[i].name.equalsIgnoreCase(encoding))
            {
                return _encodings[i].javaName;
            }
        }

        return encoding;
    
private static java.lang.reflect.MethodfindCharToByteConverterMethod()


        
        try
        {
            AccessController.doPrivileged(new PrivilegedAction() {
                public Object run() {
                    try {
                        Class charToByteConverterClass = (Class) 
                            Class.forName("sun.io.CharToByteConverter");
                        Class argTypes[] = {String.class};
                        return charToByteConverterClass.getMethod("getConverter", argTypes);
                    }
                    catch (Exception e) {
                        throw new RuntimeException(e.toString());
                    }
                }});
        }
        catch (Exception e)
        {
            System.err.println(
                "Warning: Could not get charToByteConverterClass!");
        }

        return null;
    
public static java.lang.ObjectgetCharToByteConverter(java.lang.String encoding)
Returns an opaque CharToByte converter for the specified encoding.

param
encoding The encoding
return
An object which should be a sun.io.CharToByteConverter, or null.

        if (SUN_CHAR2BYTE_CONVERTER_METHOD == null) {
            return null;
        }

        Object args[] = new Object[1];
        for (int i = 0; i < _encodings.length; ++i)
        {
            if (_encodings[i].name.equalsIgnoreCase(encoding))
            {
                try
                {
                    args[0] = _encodings[i].javaName;
                    Object converter =
                        SUN_CHAR2BYTE_CONVERTER_METHOD.invoke(null, args);
                    if (null != converter) 
                        return converter;
                }
                catch (Exception iae)
                {
                    // keep trying
                }
            }
        }

        return null;
    
public static intgetLastPrintable(java.lang.String encoding)
Returns the last printable character for the specified encoding.

param
encoding The encoding
return
The last printable character

        EncodingInfo ei;

        String normalizedEncoding = encoding.toUpperCase();
        ei = (EncodingInfo) _encodingTableKeyJava.get(normalizedEncoding);
        if (ei == null)
            ei = (EncodingInfo) _encodingTableKeyMime.get(normalizedEncoding);
        if (ei != null)
            return ei.lastPrintable;
        return m_defaultLastPrintable;
    
public static intgetLastPrintable()
Returns the last printable character for an unspecified encoding.

return
the default size

        return m_defaultLastPrintable;
    
public static java.lang.StringgetMimeEncoding(java.lang.String encoding)
Get the proper mime encoding. From the XSLT recommendation: "The encoding attribute specifies the preferred encoding to use for outputting the result tree. XSLT processors are required to respect values of UTF-8 and UTF-16. For other values, if the XSLT processor does not support the specified encoding it may signal an error; if it does not signal an error it should use UTF-8 or UTF-16 instead. The XSLT processor must not use an encoding whose name does not match the EncName production of the XML Recommendation [XML]. If no encoding attribute is specified, then the XSLT processor should use either UTF-8 or UTF-16."

param
encoding Reference to java-style encoding string, which may be null, in which case a default will be found.
return
The ISO-style encoding string, or null if failure.


                                                                                                                                             
        
    

        if (null == encoding)
        {
            try
            {

                // Get the default system character encoding.  This may be
                // incorrect if they passed in a writer, but right now there
                // seems to be no way to get the encoding from a writer.
                encoding = System.getProperty("file.encoding", "UTF8");

                if (null != encoding)
                {

                    /*
                    * See if the mime type is equal to UTF8.  If you don't
                    * do that, then  convertJava2MimeEncoding will convert
                    * 8859_1 to "ISO-8859-1", which is not what we want,
                    * I think, and I don't think I want to alter the tables
                    * to convert everything to UTF-8.
                    */
                    String jencoding =
                        (encoding.equalsIgnoreCase("Cp1252")
                            || encoding.equalsIgnoreCase("ISO8859_1")
                            || encoding.equalsIgnoreCase("8859_1")
                            || encoding.equalsIgnoreCase("UTF8"))
                            ? DEFAULT_MIME_ENCODING
                            : convertJava2MimeEncoding(encoding);

                    encoding =
                        (null != jencoding) ? jencoding : DEFAULT_MIME_ENCODING;
                }
                else
                {
                    encoding = DEFAULT_MIME_ENCODING;
                }
            }
            catch (SecurityException se)
            {
                encoding = DEFAULT_MIME_ENCODING;
            }
        }
        else
        {
            encoding = convertJava2MimeEncoding(encoding);
        }

        return encoding;
    
public static java.io.WritergetWriter(java.io.OutputStream output, java.lang.String encoding)
Returns a writer for the specified encoding based on an output stream.

param
output The output stream
param
encoding The encoding
return
A suitable writer
throws
UnsupportedEncodingException There is no convertor to support this encoding


        for (int i = 0; i < _encodings.length; ++i)
        {
            if (_encodings[i].name.equalsIgnoreCase(encoding))
            {
                try
                {
                    return new OutputStreamWriter(
                        output,
                        _encodings[i].javaName);
                }
                catch (java.lang.IllegalArgumentException iae) // java 1.1.8
                {
                    // keep trying
                }
                catch (UnsupportedEncodingException usee)
                {

                    // keep trying
                }
            }
        }

        try
        {
            return new OutputStreamWriter(output, encoding);
        }
        catch (java.lang.IllegalArgumentException iae) // java 1.1.8
        {
            throw new UnsupportedEncodingException(encoding);
        }
    
private static com.sun.org.apache.xml.internal.serializer.EncodingInfo[]loadEncodingInfo()
Load a list of all the supported encodings. System property "encodings" formatted using URL syntax may define an external encodings list. Thanks to Sergey Ushakov for the code contribution!

        URL url = null;
        try
        {
            String urlString = null;
            InputStream is = null;

            try
            {
                urlString = System.getProperty(ENCODINGS_PROP, "");
            }
            catch (SecurityException e)
            {
            }

            if (urlString != null && urlString.length() > 0) {
                url = new URL(urlString);
                is = url.openStream();
            }

            if (is == null) {
                SecuritySupport ss = SecuritySupport.getInstance();
                is = ss.getResourceAsStream(ObjectFactory.findClassLoader(),
                                            ENCODINGS_FILE);
            }

            Properties props = new Properties();
            if (is != null) {
                props.load(is);
                is.close();
            } else {
                // Seems to be no real need to force failure here, let the
                // system do its best... The issue is not really very critical,
                // and the output will be in any case _correct_ though maybe not
                // always human-friendly... :)
                // But maybe report/log the resource problem?
                // Any standard ways to report/log errors (in static context)?
            }

            int totalEntries = props.size();
            int totalMimeNames = 0;
            Enumeration keys = props.keys();
            for (int i = 0; i < totalEntries; ++i)
            {
                String javaName = (String) keys.nextElement();
                String val = props.getProperty(javaName);
                totalMimeNames++;
                int pos = val.indexOf(' ");
                for (int j = 0; j < pos; ++j)
                    if (val.charAt(j) == ',")
                        totalMimeNames++;
            }
            EncodingInfo[] ret = new EncodingInfo[totalMimeNames];
            int j = 0;
            keys = props.keys();
            for (int i = 0; i < totalEntries; ++i)
            {
                String javaName = (String) keys.nextElement();
                String val = props.getProperty(javaName);
                int pos = val.indexOf(' ");
                String mimeName;
                int lastPrintable;
                if (pos < 0)
                {
                    // Maybe report/log this problem?
                    //  "Last printable character not defined for encoding " +
                    //  mimeName + " (" + val + ")" ...
                    mimeName = val;
                    lastPrintable = 0x00FF;
                }
                else
                {
                    lastPrintable =
                        Integer.decode(val.substring(pos).trim()).intValue();
                    StringTokenizer st =
                        new StringTokenizer(val.substring(0, pos), ",");
                    for (boolean first = true;
                        st.hasMoreTokens();
                        first = false)
                    {
                        mimeName = st.nextToken();
                        ret[j] =
                            new EncodingInfo(mimeName, javaName, lastPrintable);
                        _encodingTableKeyMime.put(
                            mimeName.toUpperCase(),
                            ret[j]);
                        if (first)
                            _encodingTableKeyJava.put(
                                javaName.toUpperCase(),
                                ret[j]);
                        j++;
                    }
                }
            }
            return ret;
        }
        catch (java.net.MalformedURLException mue)
        {
            throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(mue);
        }
        catch (java.io.IOException ioe)
        {
            throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(ioe);
        }