AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfung
Thema durchsuchen
Ansicht
Themen-Optionen

(Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfung

Ein Thema von QuickAndDirty · begonnen am 20. Jul 2020 · letzter Beitrag vom 24. Dez 2020
 
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.003 Beiträge
 
Delphi 12 Athens
 
#5

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 14:15
@himitsu
Ich habe wirklich nur 3 Zeilen in dem Listing verändert. "Korrektur" steht neben dran. Der rest ist original code aus dateutils.pas.
Ich habe quasi in der Funktion aus der Dateutils.pas einfach 3 stellen gepatcht.
Ich wollte möglichst wenig EmbarcaderoCode anfassen um mein Problem zu lösen.

@Rollo62
Ich habe jetzt mal die Funktion angesehen die den Fehler macht.
Liegst in der "System.pas"
Leider bin ich nicht gut bewandert in "codierung". Ich bin darauf angewiesen das die Convertierungsmethoden funktionieren.
UTF8ToUnicode gibt es in etlichen überladenen methoden...


unit System.pas
Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1);
end;

{$IFDEF USE_LIBICU}
{$IFDEF LINUX}
function Utf8ToUnicodeICU(Dest: PWideChar; MaxDestChars: Cardinal; Source: _PAnsiChr; SourceBytes: Cardinal): Cardinal;
{$ELSE !LINUX}
function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: Cardinal; Source: _PAnsiChr; SourceBytes: Cardinal): Cardinal;
{$ENDIF LINUX}
var
  DestLen: Int32;
  ErrorConv: UErrorCode;
begin
  Result := 0;
  if Source = nil then Exit;
  ErrorConv := 0;
  DestLen := 0;
  u_strFromUTF8(PUChar(Dest), MaxDestChars, DestLen, MarshaledAString(Source), SourceBytes, ErrorConv);
  Result := DestLen;
  if Dest <> nil then
  begin
    if (Result > 0) and (Result <= MaxDestChars) then
    begin
      if Result = MaxDestChars then
      begin
        if (Result > 1) and (Word(Dest[Result - 1]) >= $DC00) and (Word(Dest[Result - 1]) <= $DFFF) then
          Dec(Result);
      end else
        Inc(Result);
      Dest[Result - 1] := #0;
    end;
  end;
end;

Edit:
!!!!!!!!!!!!!!HOLY COW!!!!!!!!!!
Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1); // _PAnsiChr(@S[1]) ist "ET" _PAnsiChr(@S[0]) müsste dann "CET" sein???
end;
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (21. Jul 2020 um 14:48 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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