![]() |
Firemonkey TUpper funktioniert nicht mit 'ß'!
Delphi XE6
Ich teste mit dem Android Emulator, habe auch versucht den Emulator auf Deutsch zu stellen! Diese ganz einfache Funktion funktioniert leider nicht! Z.b.: mit 'ö', 'ä' usw. funktioniert es, nur mit dem 'ß' klappt es nicht!
Code:
var str:String;
begin str := 'ß'; str := str.ToUpper; Caption := str; end; |
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Zitat:
|
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Hallo,
schau dazu mal unter Wiki nach, ist kein Fehler von XE6 Großschreibweise → Hauptartikel: Großes ß Beim Satz deutscher Texte in Versalien oder Kapitälchen tritt das Problem eines fehlenden Großbuchstaben „ß“ auf. Nach den heutigen Rechtschreibregeln existiert kein Großbuchstabe zum ß: „Jeder Buchstabe existiert als Kleinbuchstabe und als Großbuchstabe (Ausnahme ß).“[24] Kerstin Güthert, Geschäftsführerin des Rats für deutsche Rechtschreibung, schreibt dazu: „Es ist … eine Frage, die schon seit Jahrzehnten unbeantwortet ist und es wohl auch auf geraume Zeit auch bleiben wird. Der Grund liegt darin, daß es dem Rat für deutsche Rechtschreibung nicht zusteht, Schriftzeichen zu erfinden. Seine Aufgabe ist es, die Schreibung zu beobachten und darauf zu achten, dass Regeln und Schreibgebrauch sich im Einklang befinden. Es bedarf also einer Initiative aus der Schreibgemeinschaft …, um hier auf der Basis eines gesellschaftlichen Konsens[es] Abhilfe zu schaffen.“ – Kerstin Güthert[25] Großschreibweise mit Ersetzung von ß durch SS Die heutigen Rechtschreibregeln schreiben vor, im Versalsatz das „ß“ durch „SS“ zu ersetzen („Weiß“ wird zu „WEISS“). Ursprünglich hatte der Duden bei Großschreibweise die Ersetzung durch „SZ“ vorgesehen.[26] Diese Schreibung wurde später zugunsten der Schreibung mit „SS“ auf diejenigen wenigen Fälle begrenzt, in denen Verwechslungen möglich sind (z. B. „Maße“ → „MASZE“ gegenüber „Masse“ → „MASSE“).[27] In der reformierten Rechtschreibung von 1996 wurde die Ersetzung durch „SZ“ ganz abgeschafft. Im April 2008 wurde der Weg zu der Einführung eines ß-Großbuchstaben geebnet, siehe unten. |
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Es kommt eine exception!
Sogar wen ich ein Tabcontrol mit einen Tabitem auf das Formular lege und auf die Eigenschaft Text 'ß' rauf schreibe und starte passiert es! Da dort intern ein ToUpper ausgeführt wird(warum das Android so macht weis ich nicht), kann man auch debuggen. Da sieht man das Toupper das Problem auslöst. Meine Strings kommen von einer DB, da habe ich wenig Einfluss was der User reinschreibt. Ein 'ß' zu verbieten wäre nicht die Lösung. |
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Füge am Anfang Deiner Unit die Funktionen hinzu:
Code:
function LowerCase(const S: string): string;
begin Result := System.SysUtils.AnsiLowerCase(S); end; function UpperCase(const S: string): string; begin Result := System.SysUtils.AnsiUpperCase(S); end; |
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Zitat:
Meinst du nicht, dass es elementar wichtig wäre das zu wissen, um dir weiterhelfen zu können? Übrigens, unter Windows und XE3 kommt korrekt wieder 'ß' zurück. |
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Auch unter XE6 und Windows-Firemonkey funktioniert es, nur nicht unter Android! iOS nicht getestet.
Exception EOverflow mit der Meldung ICU-Überlauffehler: 12, U_BUFFER_OVERFLOW_ERROR, Erforderliche Länge = 0 |
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Ruft hier evtl. der Delphi-Code einfach eine entsprechende API-Funktion von Android die sich hier einfach fehlerhaft verhält?
|
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
|
AW: Firemonkey TUpper funktioniert nicht mit 'ß'!
Zitat:
Fehler passiert in System.SysUtils
Code:
function TStringHelper.ToUpper(LocaleID: TLocaleID): string;
{$IF defined(MSWINDOWS)} begin Result := Self; if Result <> '' then begin UniqueString(Result); if LCMapString(LocaleID, LCMAP_UPPERCASE or LCMAP_LINGUISTIC_CASING, PChar(Self), Self.Length, PChar(Result), Result.Length) = 0 then RaiseLastOSError; end; end; {$ELSEIF defined(USE_LIBICU)} var SelfLen: Integer; ResLen: Integer; ErrorCode: UErrorCode; begin SelfLen := Self.Length; if SelfLen > 0 then begin ErrorCode := U_ZERO_ERROR; SetLength(Result, SelfLen); ResLen := u_strToUpper(PChar(Result), SelfLen, PChar(Self), SelfLen, LocaleID, ErrorCode); if (ErrorCode > U_ZERO_ERROR) then begin SetLength(Result, ResLen); ResLen := u_strToUpper(PChar(Result), ResLen, PChar(Self), SelfLen, LocaleID, ErrorCode); // hier bleibt er stehen if (ErrorCode > U_ZERO_ERROR) then raise EOverflow.CreateFmt(SICUErrorOverflow, [Int32(ErrorCode), UTF8ToString(u_errorName(ErrorCode)), ResLen]); // Meldung end; end else Result := Self; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz