2010-08-24 14 views
8

Estoy tratando de eliminar caracteres diacríticos de un pangram en polaco. Estoy usando el código del blog de Michael Kaplan http://www.siao2.com/2007/05/14/2629747.aspx, sin embargo, sin éxito.Eliminando signos diacríticos en polaco

Considera los siguientes pangram: "Pchnąć w tę łódź jeża lub ośm skrzyń fig.". Todo funciona bien, pero para la letra "³", sigo teniendo "ł". Supongo que el problema es que "³" se representa como unicode carácter único y no hay siguiente NonSpacingMark.

¿Tiene alguna idea de cómo puedo solucionarlo (sin depender de la asignación personalizada en algún diccionario, estoy buscando algún tipo de conversión de Unicode)?

Respuesta

3

El enfoque adoptado en el artículo es eliminar la marca, los caracteres que no coinciden. Como correctamente indica que "³" no está compuesto por dos caracteres (uno de los cuales es Marca, No espaciado), se espera el comportamiento que ve.

No creo que la estructura de Unicode le permita realizar una reasignación completamente automática (el autor del artículo que usted referencia llega a la misma conclusión).

Si solo le interesan los caracteres polacos, al menos la asignación es pequeña y está bien definida (consulte, por ejemplo, el final de http://www.biega.com/special-char.html). Para el caso general, no creo que exista una solución automatizada para los caracteres que no están compuestos por un carácter estándar más un carácter de marca, nonspacing.

2

Está en el Unicode chart, punto de código \ u0142. Desplácese hasta la descripción, "letra pequeña latina con un trazo", no tiene ninguna descomposición enumerada. No sé nada sobre polaco, pero es común que una letra tenga una marca distintiva que la convierte en su propia letra en lugar de en una base con un signo diacrítico.

1

Hay bastantes caracteres precompuestos que no tienen descomposiciones significativas.

(También hay un puñado que podría tener descomposiciones razonables que están prohibidas de tal descomposición en la mayoría de las formas de normalización, ya que daría lugar a diferencias entre las versiones, lo que haría que ya no fueran normalización).

ł es uno de estos. IIRC tampoco es posible dar una transcripción de cultura neutra a los alfabetos que no usan ³. Creo que los alemanes tienden a transcribirlo en w en lugar de en l (o tal vez es otra persona que lo hace), lo que tiene sentido (tampoco es el sonido correcto, pero está más cerca que l).

2

Tendrá que reemplazar estos manualmente (al igual que con ÆÐØÞßæðøþ en Latin-1).

Otras personas han tenido el mismo problema, por lo que el Repositorio de datos de configuración regional común Unicode ha "Aceptado agregar un transliterador que elimina los acentos, incluso para acentos superpuestos". (Ticket #2884)

2

Aquí está mi implementación rápida de la lista de reproducción polaca con la normalización de los diacríticos polacos.

class StopList 
{ 
    private HashSet<String> set = new HashSet<String>(); 

    public void add(String word) 
    { 
     word = word.trim().toLowerCase(); 
     word = normalize(word); 
     set.add(word); 

    } 

    public boolean contains(final String string) 
    { 
     return set.contains(string) || set.contains(normalize(string)); 
    } 

    private char normalizeChar(final char c) 
    { 
     switch (c) 
     { 
      case 'ą': 
       return 'a'; 
      case 'ć': 
       return 'c'; 
      case 'ę': 
       return 'e'; 
      case 'ł': 
       return 'l'; 
      case 'ń': 
       return 'n'; 
      case 'ó': 
       return 'o'; 
      case 'ś': 
       return 's'; 
      case 'ż': 
      case 'ź': 
       return 'z'; 
     } 
     return c; 
    } 

    private String normalize(final String word) 
    { 
     if (word == null || "".equals(word)) 
     { 
      return word; 
     } 
     char[] charArray = word.toCharArray(); 
     char[] normalizedArray = new char[charArray.length]; 
     for (int i = 0; i < normalizedArray.length; i++) 
     { 
      normalizedArray[i] = normalizeChar(charArray[i]); 
     } 
     return new String(normalizedArray); 
    } 
} 

No pude encontrar ninguna otra solución en la red. Así que tal vez será útil para alguien

+0

esperan de la 'L' todos esos personajes que acabamos [diacríticos] (http: //en.wikipedia.org/wiki/Diacritic) (veo al menos ogonek, aguda y punto) y podría normalizarse fácilmente usando 'Normalize'. Sugeriría combinar los dos métodos. – BalusC

+0

¿Normalizar es una biblioteca .NET? Lo siento ... eso es un fragmento de mi código Java :) Y escribiendo "Net" estaba pensando en InterNet, no en ".NET". –

2

Hace algún tiempo me he encontrado con esta solución, que parece funcionar bien (?):

public static string RemoveDiacritics(this string s) 
    { 
     string asciiEquivalents = Encoding.ASCII.GetString(
        Encoding.GetEncoding("Cyrillic").GetBytes(s) 
       ); 

     return asciiEquivalents; 
    } 
+0

Eso es genial funciona como un encanto – lag

Cuestiones relacionadas