2012-12-01 1 views

risposta

15
var text = "ÜST"; 
var unaccentedText = String.Join("", text.Normalize(NormalizationForm.FormD) 
     .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)); 
+2

questo non normalizzerà 'ı'. Qualche altra soluzione? – jackjop

+0

'var text =" ÜST "; var unaccentedText = String.Join ("", text.Normalize (NormalizationForm.FormD) .Where (c => char.GetUnicodeCategory (c)! = UnicodeCategory.NonSpacingMark)). Sostituisci ("ı", "i") ; ' // swh –

7

io non sono un esperto in questo genere di cose, ma io penso è possibile utilizzare string.Normalize per farlo, decomponendo il valore e poi rimuovendo in modo efficace un caratteri non ASCII:

using System; 
using System.Linq; 
using System.Text; 

class Test 
{ 
    static void Main() 
    { 
     string text = "\u00DCST"; 
     string normalized = text.Normalize(NormalizationForm.FormD); 
     string asciiOnly = new string(normalized.Where(c => c < 128).ToArray()); 
     Console.WriteLine(asciiOnly); 
    }  
} 

È comunque possibile che questo faccia cose orribili in alcuni casi.

8

È possibile utilizzare il seguente metodo per risolvere il problema. Gli altri metodi non convertono correttamente "Turco minuscolo I (\ u0131)".

public static string RemoveDiacritics(string text) 
{ 
    Encoding srcEncoding = Encoding.UTF8; 
    Encoding destEncoding = Encoding.GetEncoding(1252); // Latin alphabet 

    text = destEncoding.GetString(Encoding.Convert(srcEncoding, destEncoding, srcEncoding.GetBytes(text))); 

    string normalizedString = text.Normalize(NormalizationForm.FormD); 
    StringBuilder result = new StringBuilder(); 

    for (int i = 0; i < normalizedString.Length; i++) 
    { 
     if (!CharUnicodeInfo.GetUnicodeCategory(normalizedString[i]).Equals(UnicodeCategory.NonSpacingMark)) 
     { 
      result.Append(normalizedString[i]); 
     } 
    } 

    return result.ToString(); 
} 
2

Questo non è un problema che richiede una soluzione generale. È noto che ci sono solo 12 caratteri speciali nell'alfabeto turco che devono essere normalizzati. Quelli sono ı, İ, ö, Ö, ç, Ç, ü, Ü, ğ, Ğ, ş, Ş. Puoi scrivere 12 regole per sostituire quelle con le loro controparti inglesi: i, I, o, O, c, C, u, U, g, G, s, S.

1
Public Function Ceng(ByVal _String As String) As String 
    Dim Source As String = "ığüşöçĞÜŞİÖÇ" 
    Dim Destination As String = "igusocGUSIOC" 
    For i As Integer = 0 To Source.Length - 1 
     _String = _String.Replace(Source(i), Destination(i)) 
    Next 
    Return _String 
End Function