Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   (Unicode) Sonderzeichen in Grundbuchstaben umwandeln (https://www.delphipraxis.net/122287-unicode-sonderzeichen-grundbuchstaben-umwandeln.html)

alzaimar 13. Okt 2008 12:10


(Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Hi Leute,

Folgendes Problem:

Vorname, Zuname in Email-Adresse verwandeln. Ist ja nicht schwer. Nur leider sind auch Tschechen, Polen und Franzosen am Start, nicht zu vergessen die Schweden und Spanier, und die haben in ihren Namen Sonderzeichen, aus denen man keine EMail-Adresse basteln kann.

Nun möchte mein Kunde die äàá usw in 'a', die öóò in 'o' usw. Natürlich nicht nur die uns bekannten Sonderzeichen, sondern auch die A-Kringel (aus Schweden), die l-Strichdurch aus Polen usw....

Gibt es da eine Unicode-Funktion oder irgendeine Tabelle, nach der man vorgehen kann? Oder muss man sich das per Hand zusammenbasteln?

Beispiel: Jörg Mørgens => 'Jorg.Morgens' (also kein ö => oe usw).

Andi1985 13. Okt 2008 12:16

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Die von dir erwähnten Sonderzeichen sind doch auch in der ACSII Tabelle zu finden:

http://www.torsten-horn.de/techdocs/ascii.htm

0224 ist dein à ...

also wandelst du einfach ascii 0224 in 0097 a um ?

oder versteh ich das problem jetzt falsch?

Jürgen Thomas 13. Okt 2008 12:20

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Hallo,

ich befürchte, das musst Du selbst regeln. Ich habe eine Liste "aller" UniCode-Chars und der UnicodeCategory zusammengestellt (genauer: zwei Textdateien); daraus kann ich aber kein Schema für Deine Bedürfnisse ableiten.

Vielleicht hilft sie Dir etwas.

@Andi1985
Er will eine Automatik für die Konvertierung 224 > 97.

Gruß Jürgen

nahpets 13. Okt 2008 12:32

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Hallo,

da habe ich nur das:
Delphi-Quellcode:
// Wandelt den übergebenen Buchstaben in Kleinbuchstaben um.
// Umlaute werden aufgelöst.
// Hierbei wird nur der ASCII-Zeichensatz verwendet.
// Der Rückgabewert ist True, wenn eine Umwandlung erfolgen konnte,
// andernfalls enthält sResult einen Leerstring.
function getLowerCase(ch : Char; Var sResult : String) : Boolean;
begin
  case ch Of
    'a'..'z'                     : sResult := ch;
    'A'..'Z'                     : sResult := LowerCase(ch);
    'À' { A mit Accent grave },
    'à' { a mit Accent grave },
    'Á' { A mit Accent acute },
    'á' { a mit Accent acute },
    'Â' { A mit Circumflex },
    'â' { a mit Circumflex },
    'Ã' { A mit Tilde },
    'ã' { a mit Tilde },
    'Å' { A mit Ring },
    'å' { a mit Ring },
    'Æ' { A mit legiertem E },
    'æ' { a mit legiertem e },
    'Ä' { A Umlaut },
    'ä' { a Umlaut }              : sResult := 'a';
    'Ç' { C mit Häkchen },
    'ç' { c mit Häkchen }         : sResult := 'c';
    'È' { E mit Accent grave },
    'è' { e mit Accent grave },
    'É' { E mit Accent acute },
    'é' { e mit Accent acute },
    'Ê' { E mit Circumflex },
    'ê' { e mit Circumflex },
    'Ë' { E Umlaut },
    'ë' { e Umlaut }              : sResult := 'e';
    'Ì' { I mit Accent grave },
    'ì' { i mit Accent grave },
    'Í' { I mit Accent acute },
    'í' { i mit Accent acute },
    'Î' { I mit Circumflex },
    'î' { i mit Circumflex },
    'Ï' { I Umlaut },
    'ï' { i Umlaut }              : sResult := 'i';
    'Ñ' { N mit Tilde },
    'ñ' { n mit Tilde }           : sResult := 'n';
    'Ò' { O mit Accent grave },
    'ò' { o mit Accent grave },
    'Ó' { O mit Accent acute },
    'ó' { o mit Accent acute },
    'Ô' { O mit Circumflex },
    'ô' { o mit Circumflex },
    'Ø' { O mit Schrägstrich },
    'ø' { o mit Schrägstrich },
    'Õ' { O mit Tilde },
    'õ' { o mit Tilde },
    'Ö' { O Umlaut },
    'ö' { o Umlaut }              : sResult := 'o';
    'Ù' { U mit Accent grave },
    'ù' { u mit Accent grave },
    'Ú' { U mit Accent acute },
    'ú' { u mit Accent acute },
    'Û' { U mit Circumflex },
    'û' { u mit Circumflex },
    'Ü' { U Umlaut },
    'ü' { u Umlaut }              : sResult := 'u';
    'ß' { scharfes S }            : sResult := 'ss';
    'ý' { y mit Accent acute },
    'Ý' { Y mit Accent acute },
    'ÿ' { y Umlaut }              : sResult := 'y';
    'þ' { thorn (isländisch) },
    'Þ' { THORN (isländisch) },
    'Ð' { Eth (isländisch) },
    'ð' { eth (isländisch) }      : sResult := AnsiLowerCase(ch);
  Else
    sResult := '';
  end;
  Result := not (sResult = '');
end;
Vielleicht ist's ja schonmal ein Ansatz.

jottkaerr 13. Okt 2008 13:57

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Für Unicode gibt es die Datei UnicodeData.txt, in der die benötigten Informationen enthalten sind. Das ist mehr oder weniger eine CSV-Datei mit Semikolon als Feldtrenner. Im ersten Feld steht die Nummer des Unicode-Zeichens, im zweiten sein offizieller Name und im sechsten eine Liste der Unicode-Zeichen, in die es zerlegt werden kann. Das erste dieser Zeichen sollte dabei immer ein "normaler" Buchstabe sein. [edit]Ich habe gerade gesehen, dass am Anfang dieses Felds noch eine Angabe in spitzen Klammern stehen kann. Diese kannst Du ignorieren.[/edit]

Es gilt aber, ein paar Fallstricke zu beachten. Zum einen ist nicht jedes Zeichen in einen Basisbuchstaben und ein oder mehrere Diakritika zerlegbar (z.B. das skandinavische Ø oder das polnische Ł), zum anderen haben natürlich nicht-lateinische, akzentuierte Buchstaben einen nicht-lateinischen Basisbuchstaben (z.B. kyrillisch oder griechisch).

jkr

Jürgen Thomas 13. Okt 2008 14:22

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Zitat:

Zitat von jottkaerr
Für Unicode gibt es die Datei UnicodeData.txt, in der die benötigten Informationen enthalten sind.

Wow, das ist es! Danke; ich werde sehen, dass ich es in meine Liste (siehe oben) einbaue. Jürgen

alzaimar 13. Okt 2008 15:31

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Oh Mann, Jungs, ihr seit Spitze. In C# gibt es ja eine Lösung, dachte das das auch für Delphi gilt

Sherlock 13. Okt 2008 16:06

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Wie sieht denn diese C# Lösung aus?

Sherlock

alzaimar 13. Okt 2008 16:13

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Code:
static string RemoveDiacritics(string stIn)
{
  string stFormD = stIn.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  for(int i = 0; i < stFormD.Length; i++)
  {
     UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[i]);
     if(uc != UnicodeCategory.NonSpacingMark)
       sb.Append(stFormD[i]);
  }   
  return(sb.ToString().Normalize(NormalizationForm.FormC));
}
Vorhin gefunden

Sherlock 13. Okt 2008 16:24

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Dann gehe ich davon aus, daß das auf diese DLL geht C:\WINDOWS\system32\Normaliz.dll

Und die kannst Du doch dann auch in Delphi verwenden ;)

http://msdn.microsoft.com/en-us/library/ms776395.aspx

Sherlock

Bernhard Geyer 13. Okt 2008 16:33

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Zitat:

Zitat von Sherlock
Dann gehe ich davon aus, daß das auf diese DLL geht C:\WINDOWS\system32\Normaliz.dll

Und die kannst Du doch dann auch in Delphi verwenden ;)

http://msdn.microsoft.com/en-us/library/ms776395.aspx

Sherlock

Wenn man Vista vorraussetzt ...
Zitat:

Requirements

Windows NT/2000/XP/Vista: Included in Windows Vista and later.
...

Sherlock 13. Okt 2008 16:36

Re: (Unicode) Sonderzeichen in Grundbuchstaben umwandeln
 
Für alle anderen Fälle:
http://www.dll-files.com/dllindex/dl...shtml?normaliz

Und in den Installer der eigenen Software darf man das auch packen.

Sherlock


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf