estamos aceptando todo tipo de caracteres nacionales en cadena UTF-8 en la entrada, y tenemos que convertirlos en cadenas ASCII en la salida para algún uso heredado. (No se aceptan caracteres chinos y japoneses, sólo los idiomas europeos)Conversión de Java UTF-8 a ASCII con suplementos
Hemos una pequeña utilidad para deshacerse de todos los signos diacríticos:
public static final String toBaseCharacters(final String sText) {
if (sText == null || sText.length() == 0)
return sText;
final char[] chars = sText.toCharArray();
final int iSize = chars.length;
final StringBuilder sb = new StringBuilder(iSize);
for (int i = 0; i < iSize; i++) {
String sLetter = new String(new char[] { chars[i] });
sLetter = Normalizer.normalize(sLetter, Normalizer.Form.NFC);
try {
byte[] bLetter = sLetter.getBytes("UTF-8");
sb.append((char) bLetter[0]);
} catch (UnsupportedEncodingException e) {
}
}
return sb.toString();
}
La cuestión es cómo reemplazar todos los alemanes afilados s (ß, Đ, đ) y otros personajes que obtienen el método de normalización anterior, con sus suplementos (en el caso de ß, el suplemento sería probablemente "ss" y en caso de que el Đ suplemento sea "D" o "Dj")
¿Hay alguna manera simple de hacerlo, sin millones de llamadas a .replaceAll()?
Así, por ejemplo: Đonardan = Djonardan, Blaß = Blass y así sucesivamente.
Podemos reemplazar todos los caracteres "problemáticos" con espacio vacío, pero nos gustaría evitar que la salida sea lo más similar posible a la entrada.
Gracias por sus respuestas,
Bozo
Tenga en cuenta que no hay una correspondencia unívoca: En alemán, se sustituye "ö" por "oe", mientras que en sueco, "ö" se reemplaza por "o". – Heinzi
Tendrá que tener esta función para tomar un parámetro de idioma y posiblemente tener un idioma predeterminado. O dedique algo de tiempo a tratar de encontrar una manera de decidir de qué lenguaje procedería la cuerda, pero eso se frenará si la cuerda no es lo suficientemente larga. De cualquier manera, parece que necesitará una tabla de búsqueda de algún tipo. Deje que su aplicación revise toda la cadena, verificando cada carácter y descubriendo con qué se debe intercambiar. – thecoshman
Otra opción podría ser reemplazar "ö" con "o:" como una especie de "diacrítico del pobre". –