2010-03-02 14 views
14

sto usando questo metodo per rimuovere gli accenti dalle mie corde:Perché non © appiattita a D durante la rimozione Accenti/diacritici

static string RemoveAccents(string input) 
{ 
    string normalized = input.Normalize(NormalizationForm.FormKD); 
    StringBuilder builder = new StringBuilder(); 
    foreach (char c in normalized) 
    { 
     if (char.GetUnicodeCategory(c) != 
     UnicodeCategory.NonSpacingMark) 
     { 
      builder.Append(c); 
     } 
    } 
    return builder.ToString(); 
} 

ma questo metodo lascia ¹ come DJ e non cambiarla a d, anche se d è il suo carattere di base. puoi provarlo con questa stringa di input "æøåáâăäĺćçčéęëěíîďđñňóôőöřůúűüýţ"

Cosa c'è di così speciale nella lettera đ?

+0

Puoi mostrare di riscrivere la stringa letterale nel formato "\ uxxxx" ecc.? Ciò renderà più facile la riproduzione senza preoccuparsi di combinare caratteri, ecc. –

+0

È un turco (o un altro personaggio dell'est europeo)? – leppie

+0

È un personaggio balcanico :-) –

risposta

13

La risposta per perché non funziona è che l'affermazione che "d è il suo carattere di base" è falsa. U + 0111 (LETIN SMALL LETTER D WITH STROKE) ha categoria Unicode "Letter, Lowercase" e non ha alcuna mappatura di scomposizione (cioè, non si decompone in "d" seguito da un segno di combinazione).

"đ".Normalize(NormalizationForm.FormD) restituisce semplicemente "đ", che non viene rimosso dal ciclo perché non è un segno di spaziatura.

Un problema simile esiste per "ø" e altre lettere per le quali Unicode non fornisce alcuna mappatura di scomposizione. (E se stai cercando di trovare il "miglior" carattere ASCII per rappresentare una lettera Unicode, questo approccio non funzionerà affatto per caratteri cirillici, greci, cinesi o altri alfabeti non latini; per esempio, potresti voler convertire "ß" in "ss". Utilizzare una libreria come UnidecodeSharp può essere d'aiuto.)

3

devo ammettere che io non sono sicuro perché questo funziona, ma sembra sicuro di

var str = "æøåáâăäĺćçčéęëěíîďđńňóôőöřůúűüýţ"; 
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str)); 

=> "aoaaaaalccceeeeiiddnnooooruuuuyt"

+0

mi piacerebbe sapere perché funziona anche questo! –

+1

La codifica "Cyrillic" sembra avere una piccola tabella di caratteri di fallback che userà quando il carattere di input non appare nella code page 1251; questo sembra un abuso di quel comportamento non documentato. Converte anche "ß" (e qualsiasi altro carattere non riconosciuto) in "?", Che potrebbe essere inappropriato (come la conversione di "æ" in "a"). Per la (quasi completa) traslitterazione Unicode, consulta http://unidecode.codeplex.com/. –

+0

Sì, è certamente un hack. In che modo Unidecode confronta con Iconv // TRANSLIT? –

3

"D with stroke" (Wikipedia) viene utilizzato in diverse lingue, e sembra essere considerato una lettera distinta in tutti loro - ed è per questo che rimane invariato.

+0

Inoltre, eth in inglese antico è mutato in "th" in inglese, mentre in norvegese è diventato "d". Al di là di una superficiale somiglianza con il capitale d, è completamente diverso. –

+0

sì ma lo stesso vale per č o ć che è anche una lettera distinta. –

+0

In particolare, Unicode definisce nessuna mappatura di scomposizione per đ (mentre lo fa per č e å, che alcuni altri alfabeti considerano essere lettere distinte). –

-4

questo dovrebbe funzionare

private static String RemoveDiacritics(string text) 
    { 
     String normalized = text.Normalize(NormalizationForm.FormD); 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < normalized.Length; i++) 
     { 
      Char c = normalized[i]; 
      if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
       sb.Append(c); 
     } 

     return sb.ToString(); 
    } 
+0

Sembra proprio come il codice del poster originale con FormKD modificato in FormD (e piccoli cambiamenti stilistici).Questo non funzionerà per i motivi indicati in altre risposte. –

+0

Ho usato FormD tutto il tempo fino ad ora e non ero a conoscenza di questo problema, tuttavia come posso vedere (l'ho appena testato) hai ragione. Non funziona. – mare

Problemi correlati