/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.util; import java.nio.charset.Charset; import java.util.*; /** * * This class provides a number of static methods which interact with * java.nio.charset.Charset to analyze and transform the strings identifing * character encodings. */ abstract public class CharEncoding { static Set<String> macEncodings = new HashSet<>() ; static { macEncodings.add("MacArabic") ; macEncodings.add("MacCentralEurope") ; macEncodings.add("MacCroatian") ; macEncodings.add("MacCyrillic") ; macEncodings.add("MacDingbat") ; macEncodings.add("MacGreek") ; macEncodings.add("MacHebrew") ; macEncodings.add("MacIceland") ; macEncodings.add("MacRoman") ; macEncodings.add("MacRomania") ; macEncodings.add("MacSymbol") ; macEncodings.add("MacThai") ; macEncodings.add("MacTurkish") ; macEncodings.add("MacUkraine") ; } private String name ; private CharEncoding() {} private CharEncoding(String name) { this.name = name ; } /** * Gives the canonical name for this charset. * If {@link #isIANA()} returns true, then * this is the name registered at IANA. * If {@link #isInNIO()} returns true, and * {@link #isIANA()} returns false, then this name * will start with "x-". * The name is case insensitive, but not case * normalized. * @return Canonical name. */ public String name() { return name; } /** * Returns true if this charset * registered at IANA. * Since the registry may change, the results of this * method may not be entirely up-to-date, * and draws from the knowledge in * the Java java.nio.charset.Charset class. * If {@link #isInNIO()} returns false, no information * is known, and this method returns false. * @return true if this character encoding is IANA registered. */ abstract public boolean isIANA(); /** * Returns true if this charset is supported by * java.nio.charset.Charset. * Without this support {@link #isIANA()} * does not work correctly. * @return true if this charset is supported by * java.nio.charset.Charset. */ abstract public boolean isInNIO(); /** * If {@link #isIANA} or {@link #isInNIO} * return false, this returns a suggested warning * message. If {@link #isIANA} is true, then this * returns null. * @return A message (or null) */ abstract public String warningMessage(); static private class IANAnioEncoding extends CharEncoding { IANAnioEncoding(String name) { super(name); } @Override public boolean isIANA() { return true; } @Override public boolean isInNIO() { return true; } @Override public String warningMessage() { return null; } } static private class NonIANAnioEncoding extends CharEncoding { NonIANAnioEncoding(String name) { super(name); } @Override public boolean isIANA() { return false; } @Override public boolean isInNIO() { return true; } @Override public String warningMessage() { return "The encoding \"" + name() + "\" is not registered with IANA, and hence not suitable for Web content."; } } static private class NotNioEncoding extends CharEncoding { NotNioEncoding(String name) { super(name); } @Override public boolean isIANA() { return false; } @Override public boolean isInNIO() { return false; } @Override public String warningMessage() { return "The encoding \"" + name() + "\" is not fully supported; maybe try using Java 1.5 or higher (if you are not already)."; } } /** * Create a new CharacterEncoding object, * given a name of a character encoding * identifying it. * @param enc A name. * @return The corresponding CharacterEncoding object. */ static public CharEncoding create(String enc){ if (Charset.isSupported(enc)) { String nm = Charset.forName(enc).name(); if (nm.charAt(1)=='-' && (nm.charAt(0)=='x' || nm.charAt(0)=='X') ) return new NonIANAnioEncoding(nm); else if (nm.startsWith("Mac") && macEncodings.contains(nm) ) return new NonIANAnioEncoding(nm); else return new IANAnioEncoding(nm); } else { return new NotNioEncoding(enc); } } }