mschnell hat geschrieben:Wie bekomme ich das heraus ?
Gut, dann treffe ich mal einige Annahmen:
- Du arbeitest mit einem deutschen Windows, dann ist die Systemcodierung cp1252.
http://en.wikipedia.org/wiki/Windows-1252
- Du hast Lazarus 0.9.26, FPC 2.2.2, hast fpc.cfg nicht verändert und benützt die default-Einstellungen.
In übrigen verlasse ich mich auf die Aussagen von Jonas Maebe:
http://www.mail-archive.com/fpc-pascal% ... 14177.html
In früheren FPC Versionen war das glaube ich anders gelöst.
-Der Quellcode ist in utf-8 gespeichert, es gibt keinen BOM.
Code: Alles auswählen
var
s1, s2, s3: string; //in {$mode objfpc}{$h+} sind dies ansistrings
c1: char;
i1: Integer;
su1, su2: UTF8String;
sw1, sw2: Widestring;
ss1, ss2: ShortString;
sa1, sa2: AnsiString;
wstr1,wstr2,wstr3,wstr4: widestring;
begin
s1 := 'abcdefhäöü';
//im quelltext steht hier 'abcdefh'#195#164#195#182#195#188
s2 := UpperCase(s1);
//dies ist ASCII uppercase,
//resultat: 'ABCDEFH'#195#164#195#182#195#188
sa1 := 'abcdefhäöü';
//im quelltext steht hier 'abcdefh'#195#164#195#182#195#188
sa2 := AnsiUpperCase(sa1);
//hier wird die Windows Funktion CharUpperBuf() aufgerufen,
//sie erwartet cp1252 codierung und gibt cp1252 zurück.
//sa1 in cp1252 interpretiert bedeutet
// 'abcdefhäöü'
//resultat: 'ABCDEFHäöü'
c1 := s1[1];
su1 := AnsiToUtf8(s1);
(*
function AnsiToUtf8(const s : ansistring): UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
begin
Result:=Utf8Encode(s);
end;
function UTF8Encode(const s : WideString) : UTF8String;
var
i : SizeInt;
hs : UTF8String;
begin
result:='';
if s='' then
exit;
SetLength(hs,length(s)*3);
i:=UnicodeToUtf8(pchar(hs),length(hs)+1,PWideChar(s),length(s));
if i>0 then
begin
SetLength(hs,i-1);
result:=hs;
end;
end;
procedure Win32Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt);
var
destlen: SizeInt;
begin
// retrieve length including trailing #0
// not anymore, because this must also be usable for single characters
destlen:=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, source, len, nil, 0);
// this will null-terminate
setlength(dest, destlen);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, source, len, @dest[1], destlen);
end;
*)
// 'abcdefhäöü' wird in von cp-1252 in Unicode gewandelt,
// ergibt:
// 'abcdefh'#195#164#195#182#195#188', in utf-8 codiert:
// 'abcdefh'#195#131#194#164#195#131#194#182#195#131#194#188
su2 := su1; // UTF8LowerCase(su1);
sw1 := s1;
// 'abcdefhäöü' wird in von cp-1252 in Unicode gewandelt,
// ergibt:
// 'abcdefh'#195#164#195#182#195#188' = 'abcdefhäöü'
sw2 := WideUpperCase(sw1);
// 'abcdefhäöü' -> 'ABCDEFHäöü' (Unicode)
s3 := sw2;
// Unicode 'ABCDEFHäöü' wird auf cp1252 gewandelt, ergibt:
// 'ABCDEFH'#195#164#195#182#195#188 oder 'ABCDEFHäöü'
ss1 := s1;
//ss1 = 'abcdefh'#195#164#195#182#195#188
ss2 := Uppercase(ss1);
//ASCII uppercase = 'ABCDEFH'#195#164#195#182#195#188
wstr1:= utf8decode(su1);
wstr2:= utf8decode(su2);
wstr3:= utf8decode(ansistring(sw1));
wstr4:= utf8decode(ansistring(sw2));
{
//Lazarus interpretiert die übergebenen ansistrings als utf-8
Memo1.Lines.Add(s1);
//'abcdefh'#195#164#195#182#195#188 -> 'abcdefhäöü'
Memo1.Lines.Add(s2);
//'ABCDEFH'#195#164#195#182#195#188 -> 'ABCDFHäöü'
Memo1.Lines.Add(s3);
//'ABCDEFH'#195#164#195#182#195#188 -> 'ABCDFHäöü'
Memo1.Lines.Add(su1);
//'abcdefh'#195#131#194#164#195#131#194#182#195#131#194#188 ->
//'abcdefhäöü'
Memo1.Lines.Add(su2);
//'abcdefh'#195#131#194#164#195#131#194#182#195#131#194#188 ->
//'abcdefhäöü'
Memo1.Lines.Add(sw1);
//sw1 wird von Unicode in cp1252 gewandelt und als utf8 interpretiert:
//'abcdefh'#195#164#195#182#195#188 -> 'abcdefhäöü'
Memo1.Lines.Add(sw2);
//sw2 wird von Unicode in cp1252 gewandelt und als utf8 interpretiert:
//'ABCDEFH'#195#164#195#182#195#188 -> 'ABCDEFHäöü'
//Und so weiter...
Memo1.Lines.Add(ss1);
Memo1.Lines.Add(ss2);
Memo1.Lines.Add(sa1);
Memo1.Lines.Add(sa2);
i1 := sizeof(c1);
Memo1.Lines.Add('-' + ' ' + inttostr(i1));
}
end.
Martin