Ich versuche, einige Zeichenfolgen in Französisch-Kanadisch umzuwandeln, und im Grunde möchte ich in der Lage sein, die französischen Akzentzeichen in den Buchstaben zu entfernen, während der Buchstabe beibehalten wird. (ZB konvertieren é
zu e
, crème brûlée
würde also werden creme brulee
)
Was ist die beste Methode, um dies zu erreichen?
.net
string
diacritics
James Hall
quelle
quelle
Antworten:
Ich habe diese Methode nicht verwendet, aber Michael Kaplan beschreibt eine Methode dafür in seinem Blog-Beitrag (mit einem verwirrenden Titel), in der es um das Entfernen von Diakritika geht: Das Entfernen ist ein interessanter Job (auch bekannt als bedeutungslos, auch bekannt als All Mn-Zeichen) sind nicht abstandsreich, aber einige sind abstandsloser als andere)
Beachten Sie, dass dies eine Fortsetzung seines früheren Beitrags ist: Diakritika entfernen ....
Der Ansatz verwendet String.Normalize , um die Eingabezeichenfolge in konstituierende Glyphen aufzuteilen (im Grunde genommen werden die "Basis" -Zeichen von den diakritischen Zeichen getrennt). Anschließend wird das Ergebnis gescannt und nur die Basiszeichen beibehalten . Es ist nur ein bisschen kompliziert, aber Sie sehen wirklich ein kompliziertes Problem.
Wenn Sie sich auf Französisch beschränken, könnten Sie wahrscheinlich mit dem einfachen tabellenbasierten Ansatz in Entfernen von Akzenten und Tilde in einem C ++ std :: string durchkommen, wie von @David Dibben empfohlen.
quelle
das hat den Trick für mich getan ...
schnell & kurz!
quelle
«
»
und…
(als einzelnes Zeichen) werden dabei geändert, was bei der akzeptierten Lösung nicht der Fall ist.System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
System.Text.Encoding.CodePages
von Nuget und rufen Sie dies an, um den Anbieter zu registrieren:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- Sobald Sie dies getan haben, können Sie ISO-8859-8Falls jemand interessiert ist, habe ich nach etwas Ähnlichem gesucht und folgendes geschrieben:
quelle
c < 128
, um sicherzustellen, dass keine UTF-Zeichen erfasst werden ( siehe hier) .c < 123
. siehe ASCIIch brauchte etwas, das alle wichtigen Unicode-Zeichen konvertiert, und die abgestimmte Antwort ließ einige aus, sodass ich eine Version von CodeIgniter
convert_accented_characters($str)
in C # erstellt habe, die leicht anpassbar ist:Verwendungszweck
quelle
if (entry.Key.IndexOf(c) != -1)
inif (entry.Key.Contains(c))
{ "äæǽ", "ae" }
anstatt{ "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }
nur anzurufenif (foreign_characters.TryGetValue(...)) ...
. Sie haben den Zweck des Index, den das Wörterbuch bereits hat, vollständig besiegt.Falls jemand interessiert ist, hier ist das Java-Äquivalent:
quelle
Ich verwende oft eine Erweiterungsmethode, die auf einer anderen Version basiert, die ich hier gefunden habe (siehe Ersetzen von Zeichen in C # (ascii) ). Eine kurze Erklärung:
Code:
quelle
Die CodePage of Greek (ISO) kann das
Die Informationen zu dieser Codepage sind in
System.Text.Encoding.GetEncodings()
. Weitere Informationen finden Sie unter: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspxGriechisch (ISO) hat die Codepage 28597 und den Namen iso-8859-7 .
Gehe zum Code ... \ o /
Also, schreibe diese Funktion ...
Beachten Sie, dass ...
Encoding.GetEncoding("iso-8859-7")
äquivalent zu ist,Encoding.GetEncoding(28597)
da erstens der Name und zweitens die Codepage der Codierung ist.quelle
äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı
). Die Probleme wurden nur mit gefundenßə
, in die konvertiert wird?
, aber solche Ausnahmen können immer getrennt behandelt werden. Bevor dies in Produktion geht, sollte der Test besser gegen alle Unicode-Bereiche durchgeführt werden, die Buchstaben mit diakritischen Zeichen enthalten.Es ist lustig, dass eine solche Frage so viele Antworten bekommen kann und doch keine meinen Anforderungen entspricht :) Es gibt so viele Sprachen, eine vollständige sprachunabhängige Lösung ist AFAIK nicht wirklich möglich, da andere erwähnt haben, dass FormC oder FormD Probleme geben.
Da sich die ursprüngliche Frage auf Französisch bezog, ist die einfachste Antwort tatsächlich
1251 sollte durch den Codierungscode der Eingabesprache ersetzt werden.
Dies ersetzt jedoch nur ein Zeichen durch ein Zeichen. Da ich auch mit Deutsch als Eingabe arbeite, habe ich eine manuelle Konvertierung durchgeführt
Es liefert möglicherweise nicht die beste Leistung, ist aber zumindest sehr einfach zu lesen und zu erweitern. Regex ist ein NO GO, viel langsamer als jedes Char / String-Zeug.
Ich habe auch eine sehr einfache Methode, um Leerzeichen zu entfernen:
Schließlich verwende ich eine Kombination aller drei oben genannten Erweiterungen:
Und ein kleiner Unit-Test zu dem (nicht erschöpfenden), der erfolgreich besteht.
quelle
Dies funktioniert gut in Java.
Grundsätzlich werden alle Zeichen mit Akzent in ihre Gegenstücke mit Akzent umgewandelt, gefolgt von ihren kombinierten Diakritika. Jetzt können Sie eine Regex verwenden, um die Diakritika zu entfernen.
quelle
"\\p{Block=CombiningDiacriticalMarks}"
TL; DR - C # String-Erweiterungsmethode
Ich denke, die beste Lösung, um die Bedeutung der Zeichenfolge beizubehalten, besteht darin, die Zeichen zu konvertieren, anstatt sie zu entfernen, was im Beispiel gut dargestellt ist
crème brûlée
incrme brle
vs.creme brulee
.Ich habe mir Alexanders Kommentar oben angesehen gelesen und festgestellt, dass der Lucene.Net-Code Apache 2.0-lizenziert ist. Daher habe ich die Klasse in eine einfache String-Erweiterungsmethode geändert. Sie können es so verwenden:
Die Funktion ist zu lang, um sie in einer StackOverflow-Antwort zu veröffentlichen (~ 139.000 Zeichen von 30.000 erlaubt lol), also habe ich einen Kern gemacht und die Autoren zugeschrieben :
Ich hoffe, das hilft jemand anderem. Dies ist die robusteste Lösung, die ich gefunden habe!
quelle
DAS IST DIE VB-VERSION (funktioniert mit GRIECHISCH):
Importiert System.Text
Importiert System.Globalization
quelle
Probieren Sie das HelperSharp-Paket aus .
Es gibt eine Methode RemoveAccents:
quelle
So ersetze ich diakritische Zeichen in meinem gesamten .NET-Programm durch nicht diakritische Zeichen
C #:
VB .NET:
quelle
Sie können die Zeichenfolgenerweiterung aus dem Nuget-Paket MMLib.Extensions verwenden:
Nuget-Seite: https://www.nuget.org/packages/MMLib.Extensions/ Codeplex-Projektseite https://mmlib.codeplex.com/
quelle
Stellen Sie diese Bibliothek hier bereit, wenn Sie sie noch nicht berücksichtigt haben. Es sieht so aus, als gäbe es eine ganze Reihe von Unit-Tests.
https://github.com/thomasgalliker/Diacritics.NET
quelle
quelle
Was diese Person gesagt hat:
Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));
Tatsächlich werden solche wie
å
ein Zeichen ( dh der Zeichencode00E5
, nicht0061
plus der Modifikator030A
, der gleich aussehen würde) ina
plus eine Art Modifikator aufgeteilt, und dann entfernt die ASCII-Konvertierung den Modifikator, wobei der einzige übrig bleibta
.quelle
Ich mag den prägnanten und funktionalen Code von azrafe7 sehr . Also habe ich es ein wenig geändert, um es in eine Erweiterungsmethode umzuwandeln:
quelle
Ich habe nicht genug Ruf, anscheinend kann ich Alexanders exzellenten Link nicht kommentieren. - Lucene scheint die einzige Lösung zu sein, die in einigermaßen generischen Fällen funktioniert.
Für diejenigen, die eine einfache Copy-Paste-Lösung suchen, ist hier die Verwendung von Code in Lucene:
string testbed = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôöøúüāăčĐęğıŁłńŌōřŞşšźžșțệủ";
Console.WriteLine (Lucene.latinizeLucene (Testbed));
///////////
quelle