AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Char to AnsiChar

Ein Thema von PMM · begonnen am 15. Jan 2010 · letzter Beitrag vom 16. Jan 2010
Antwort Antwort
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#1

Char to AnsiChar

  Alt 15. Jan 2010, 15:33
Beim Umstellen auf Delphi 2009 stolpere ich über eine Stelle, an der mir eine Funktion aus einer alten LIB einen AnsiChar (8Bit) liefert, der nun mit einem neuen CHAR (16Bit) verglichen werden muss. Der Compiler weigert sich zurecht das zu tun. Da ich aber weiss, dass im NewCHAR auch nur ein Ansi-Character stehen wird, hab ich nun einfach;
 oldchar = AnsiChar(NewChar) geschrieben und der Compiler ist erstmal zufrieden. Ist dieser Cast sicher oder gibt es was besseres/richtigeres?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

Re: Char to AnsiChar

  Alt 15. Jan 2010, 15:52
Zitat von PMM:
geschrieben und der Compiler ist erstmal zufrieden. Ist dieser Cast sicher oder gibt es was besseres/richtigeres?
Das würde ich nicht machen, außer es handelt sich um ASCII-Zeichen (7 Bit), dann zwischen Ansi und Unicode ist nur der ASCII-Bereich zueinander kompatiben und der Rest hängt von der CodePage ab.

Wenn du weißt, daß die alte Lib nur Ansi liefert und auch nie eine Umstellung geplant ist,
warum arbeitest du dann im neuen Programm nicht direkt mit AnsiChar?


Wie genau sind deine zu vergleichenden Typen/Variablen definiert?

Delphi-Quellcode:
var C: AnsiChar;
  T, C2: WideChar;
begin
  C := 's';
  C2 := 'd';
  If (MultiByteToWideChar(DefaultUserCodePage, 0, @C, 1, @T, 1) = 1) and (T = C2) Then
    {gleich}
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#3

Re: Char to AnsiChar

  Alt 15. Jan 2010, 16:02
> warum arbeitest du dann im neuen Programm nicht direkt mit AnsiChar?
Weil im "neuen Programm" halt auch eine LIB werkelt die nun mal einen CHAR liefert. Zu schreiben ist nur der "Glue-Code" der beide verbindet. Am besten wäre natürlich eine  Function CharToAnsiChar(NewChar: Char): AnsiChar; die ein Exception auslöst, wenn das Char da nicht reinpasst. Wie könnte sowas aussehen?
Peter
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Char to AnsiChar

  Alt 15. Jan 2010, 16:03
Zudem müsste dann auch eine direkte Zuweisung funktionieren
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

Re: Char to AnsiChar

  Alt 15. Jan 2010, 16:13
Zitat:
CharToAnsiChar
Oben mal ein AnsiCharToChar, welches sich auch in eine Funktion kapseln ließe.

Andersrum und mit Exception isses etwas scherer, aber möglich.
> "Ersatzzeichen" abfragen
> umwandeln
> prüfen ob Result dem Ersatzzeichen entsprichen, aber es nicht schon vorher diesem entsprach
> und wenn ja, dann Exception
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#6

Re: Char to AnsiChar

  Alt 15. Jan 2010, 16:27
@himitsu
> Wie genau sind deine zu vergleichenden Typen/Variablen definiert?
als CHAR bzw. ANSICHAR
Das MultiByteToWideChar mit AnsiChar umgehen kann, hätte ich vom Namen her nicht erwartet. Werde ich mir aber mal ansehen.

@mkinzer
> Zudem müsste dann auch eine direkte Zuweisung funktionieren
Nee AnsiChar := CHAR geht genausowenig wie CHAR := AnsiCHAR
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

Re: Char to AnsiChar

  Alt 15. Jan 2010, 16:36
Zitat von PMM:
Das MultiByteToWideChar mit AnsiChar umgehen kann, hätte ich vom Namen her nicht erwartet.
Es kommt eben auf die CodePage drauf an.

UTF-8 (CodePage = 65001) ist z.B. der bekannteste Multibyte-Zeichensatz, welcher in einen "ANSI"-String reinpaßt.

MultiByte heißt es deswegen, weil verschiedene der Codepages bestimmte Zeichen in mehreren Bytes speichern.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#8

Re: Char to AnsiChar

  Alt 16. Jan 2010, 17:11
Also ich hab es je so gemacht:
Delphi-Quellcode:
Function IsSameChar(aAnsiChar: AnsiChar; aChar: Char): Boolean;
Var aStr: String;
begin
  aStr := aAnsiChar;
  Result := aStr=aChar;
end;
Die Umwandlung AnsiChar -> Char macht die Zuweisung (allerdings auf einen String) automatisch und das funktioniert auch für nicht ASCII-Zeichen. z.B. liefert das AnsiChar #$80 das Zeichen '€' ($20AC). Die Umkehrung Char -> AnsiChar hab ich nicht hinbekommen. Kein der Funktionen Utf8ToAnsi, UTF8EncodeToShortString oder UnicodeToUtf8 liefert für das Zeichen '€' den Wert $80 zurück.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

Re: Char to AnsiChar

  Alt 16. Jan 2010, 17:29
Der untere Teile eines AnsiChar ist fest und der Obere hängt von der jeweiligen CodePage ab.

#$00 bis #$7F = ASCII / fest
#$80 bis #$FF = CodePage-abhängig

PS: #$80 ist nur in der "deutschen" CodePage ein € ... die Russen brauchen kein € und haben deswegen diesen "erweiterten" Bereich mit anderen Zeichen belegt.

Zitat von PMM:
Kein der Funktionen Utf8ToAnsi, UTF8EncodeToShortString oder UnicodeToUtf8 liefert für das Zeichen '€' den Wert $80 zurück.
Hab ich gesagt, daß dieses UTF-8 sein soll?

UTF-8 ist EINER von VIELEN MultiByte-Zeichenätzen

nimm mal WideCharToMultiByte, zusammen mit der "deutschen" CodePage.
(nix anderes macht Delphi intern bei der Zuweisung an den String)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#10

Re: Char to AnsiChar

  Alt 16. Jan 2010, 17:55
Zitat:
Die Umkehrung Char -> AnsiChar hab ich nicht hinbekommen.
stimmt nicht ganz. Es funktioniert z.B. die "Holzhammermethode":
Delphi-Quellcode:
Function CharToAnsiChar(Const aChar: Char): AnsiChar;
Var I: Integer;
 aStr: String;
begin
  I := 1;
  repeat
    aStr := AnsiChar(I);
    inc(I);
  until (I > 255) or (aStr=aChar);
  if (aStr=aChar)
    then Result := AnsiChar(I-1)
    else raise EConvertError.CreateFmt('Could''nt convert %s to AnsiChar.',[aChar]);
end;
Vermutlich geht es auch mit WideCharToMultiByte (das ist auch das was die genannten UTF8 Konverter intern verwenden, soweit ich das gesehen habe) wenn man die geeignete Codepage usw. auswählt (muss ja zur Laufzeit nicht die deutsche sein...).

So hier noch eine WideCharToMultiByte Variante
Delphi-Quellcode:
Function CharToAnsiCharX(Const aChar: Char): AnsiChar;
Var aStr: String;
  aAnsiStr: AnsiString;
Begin
  aStr := aChar;
  aAnsiStr := ' ';
  If WideCharToMultiByte(CP_ACP,0,@aStr[1],-1,@aAnsiStr[1],2,nil,nil) > 0
    then begin
    if aAnsiStr[2] = #0
      then Result := aAnsiStr[1]
      else raise EConvertError.CreateFmt('Could''nt convert %s to AnsiChar.',[aChar]);
    end
    else EConvertError.Create('CharToAnsiCharX: WideCharToMultiByte failed');
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz