blob: 9d91acaa5f87d8da2cd800b239d989d94f01ad17 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed 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 android.util;
import android.os.Build;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
/**
* A class containing utility methods related to character sets. This
* class is primarily useful for code that wishes to be vendor-aware
* in its interpretation of Japanese encoding names.
*
* <p>As of this writing, the only vendor that is recognized by this
* class is Docomo (identified case-insensitively as {@code "docomo"}).</p>
*
* <b>Note:</b> This class is hidden in Cupcake, with a plan to
* un-hide in Donut. This was done because the first deployment to use
* this code is based on Cupcake, but the API had to be introduced
* after the public API freeze for that release. The upshot is that
* only system applications can safely use this class until Donut is
* available.
*
* @hide
*/
public final class CharsetUtils {
/**
* name of the vendor "Docomo". <b>Note:</b> This isn't a public
* constant, in order to keep this class from becoming a de facto
* reference list of vendor names.
*/
private static final String VENDOR_DOCOMO = "docomo";
/**
* This class is uninstantiable.
*/
private CharsetUtils() {
// This space intentionally left blank.
}
/**
* Returns the name of the vendor-specific character set
* corresponding to the given original character set name and
* vendor. If there is no vendor-specific character set for the
* given name/vendor pair, this returns the original character set
* name. The vendor name is matched case-insensitively.
*
* @param charsetName the base character set name
* @param vendor the vendor to specialize for
* @return the specialized character set name, or {@code charsetName} if
* there is no specialized name
*/
public static String nameForVendor(String charsetName, String vendor) {
// TODO: Eventually, this may want to be table-driven.
if (vendor.equalsIgnoreCase(VENDOR_DOCOMO)
&& isShiftJis(charsetName)) {
return "docomo-shift_jis-2007";
}
return charsetName;
}
/**
* Returns the name of the vendor-specific character set
* corresponding to the given original character set name and the
* default vendor (that is, the targeted vendor of the device this
* code is running on). This method merely calls through to
* {@link #nameForVendor(String,String)}, passing the default vendor
* as the second argument.
*
* @param charsetName the base character set name
* @return the specialized character set name, or {@code charsetName} if
* there is no specialized name
*/
public static String nameForDefaultVendor(String charsetName) {
return nameForVendor(charsetName, getDefaultVendor());
}
/**
* Returns the vendor-specific character set corresponding to the
* given original character set name and vendor. If there is no
* vendor-specific character set for the given name/vendor pair,
* this returns the character set corresponding to the original
* name. The vendor name is matched case-insensitively. This
* method merely calls {@code Charset.forName()} on a name
* transformed by a call to {@link #nameForVendor(String,String)}.
*
* @param charsetName the base character set name
* @param vendor the vendor to specialize for
* @return the specialized character set, or the one corresponding
* directly to {@code charsetName} if there is no specialized
* variant
* @throws UnsupportedCharsetException thrown if the named character
* set is not supported by the system
* @throws IllegalCharsetNameException thrown if {@code charsetName}
* has invalid syntax
*/
public static Charset charsetForVendor(String charsetName, String vendor)
throws UnsupportedCharsetException, IllegalCharsetNameException {
charsetName = nameForVendor(charsetName, vendor);
return Charset.forName(charsetName);
}
/**
* Returns the vendor-specific character set corresponding to the
* given original character set name and default vendor (that is,
* the targeted vendor of the device this code is running on).
* This method merely calls through to {@link
* #charsetForVendor(String,String)}, passing the default vendor
* as the second argument.
*
* @param charsetName the base character set name
* @return the specialized character set, or the one corresponding
* directly to {@code charsetName} if there is no specialized
* variant
* @throws UnsupportedCharsetException thrown if the named character
* set is not supported by the system
* @throws IllegalCharsetNameException thrown if {@code charsetName}
* has invalid syntax
*/
public static Charset charsetForVendor(String charsetName)
throws UnsupportedCharsetException, IllegalCharsetNameException {
return charsetForVendor(charsetName, getDefaultVendor());
}
/**
* Returns whether the given character set name indicates the Shift-JIS
* encoding. Returns false if the name is null.
*
* @param charsetName the character set name
* @return {@code true} if the name corresponds to Shift-JIS or
* {@code false} if not
*/
private static boolean isShiftJis(String charsetName) {
// Bail quickly if the length doesn't match.
if (charsetName == null) {
return false;
}
int length = charsetName.length();
if (length != 4 && length != 9) {
return false;
}
return charsetName.equalsIgnoreCase("shift_jis")
|| charsetName.equalsIgnoreCase("shift-jis")
|| charsetName.equalsIgnoreCase("sjis");
}
/**
* Gets the default vendor for this build.
*
* @return the default vendor name
*/
private static String getDefaultVendor() {
return Build.BRAND;
}
}