|
@@ -78,7 +78,7 @@ begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
-procedure DefaultAnsi2UnicodeMove(source:pchar;var dest:unicodestring;len:SizeInt);
|
|
|
+procedure DefaultAnsi2UnicodeMove(source:pchar;cp : TSystemCodePage;var dest:unicodestring;len:SizeInt);
|
|
|
var
|
|
|
i : SizeInt;
|
|
|
p : PUnicodeChar;
|
|
@@ -304,7 +304,7 @@ begin
|
|
|
Size:=Length(S2);
|
|
|
if Size>0 then
|
|
|
begin
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc(PChar(@S2[1]),result,Size);
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(PChar(@S2[1]),DefaultSystemCodePage,result,Size);
|
|
|
{ Terminating Zero }
|
|
|
PUnicodeChar(Pointer(fpc_ShortStr_To_UnicodeStr)+Size*sizeof(UnicodeChar))^:=#0;
|
|
|
end;
|
|
@@ -335,7 +335,7 @@ begin
|
|
|
result:='';
|
|
|
Size:=Length(S2);
|
|
|
if Size>0 then
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc(PChar(S2),result,Size);
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(PChar(S2),StringCodePage(S2),result,Size);
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -671,8 +671,8 @@ Function fpc_Char_To_UChar(const c : Char): UnicodeChar; compilerproc;
|
|
|
var
|
|
|
w: unicodestring;
|
|
|
begin
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc(@c, w, 1);
|
|
|
- fpc_Char_To_UChar:= w[1];
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(@c,DefaultSystemCodePage,w,1);
|
|
|
+ fpc_Char_To_UChar:=w[1];
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -718,8 +718,8 @@ Function fpc_Char_To_WChar(const c : Char): WideChar; compilerproc;
|
|
|
var
|
|
|
w: widestring;
|
|
|
begin
|
|
|
- widestringmanager.Ansi2WideMoveProc(@c, w, 1);
|
|
|
- fpc_Char_To_WChar:= w[1];
|
|
|
+ widestringmanager.Ansi2WideMoveProc(@c,DefaultSystemCodePage,w,1);
|
|
|
+ fpc_Char_To_WChar:=w[1];
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -817,7 +817,7 @@ begin
|
|
|
exit;
|
|
|
end;
|
|
|
l:=IndexChar(p^,-1,#0);
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc(P,fpc_PChar_To_UnicodeStr,l);
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(P,DefaultSystemCodePage,fpc_PChar_To_UnicodeStr,l);
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -825,21 +825,21 @@ Function fpc_CharArray_To_UnicodeStr(const arr: array of char; zerobased: boolea
|
|
|
var
|
|
|
i : SizeInt;
|
|
|
begin
|
|
|
- if (zerobased) then
|
|
|
+ if zerobased then
|
|
|
begin
|
|
|
- if (arr[0]=#0) Then
|
|
|
- begin
|
|
|
- fpc_chararray_to_unicodestr := '';
|
|
|
- exit;
|
|
|
- end;
|
|
|
+ if arr[0]=#0 Then
|
|
|
+ begin
|
|
|
+ fpc_chararray_to_unicodestr:='';
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
i:=IndexChar(arr,high(arr)+1,#0);
|
|
|
- if i = -1 then
|
|
|
- i := high(arr)+1;
|
|
|
+ if i=-1 then
|
|
|
+ i:=high(arr)+1;
|
|
|
end
|
|
|
else
|
|
|
- i := high(arr)+1;
|
|
|
+ i:=high(arr)+1;
|
|
|
SetLength(fpc_CharArray_To_UnicodeStr,i);
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc (pchar(@arr),fpc_CharArray_To_UnicodeStr,i);
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(pchar(@arr),DefaultSystemCodePage,fpc_CharArray_To_UnicodeStr,i);
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -1173,7 +1173,7 @@ begin
|
|
|
len := length(src);
|
|
|
{ make sure we don't dereference src if it can be nil (JM) }
|
|
|
if len > 0 then
|
|
|
- widestringmanager.ansi2unicodemoveproc(pchar(@src[1]),temp,len);
|
|
|
+ widestringmanager.ansi2unicodemoveproc(pchar(@src[1]),DefaultSystemCodePage,temp,len);
|
|
|
len := length(temp);
|
|
|
if len > length(res) then
|
|
|
len := length(res);
|
|
@@ -1194,7 +1194,7 @@ begin
|
|
|
len := length(src);
|
|
|
{ make sure we don't access char 1 if length is 0 (JM) }
|
|
|
if len > 0 then
|
|
|
- widestringmanager.ansi2unicodemoveproc(pchar(@src[1]),temp,len);
|
|
|
+ widestringmanager.ansi2unicodemoveproc(pchar(@src[1]),DefaultSystemCodePage,temp,len);
|
|
|
len := length(temp);
|
|
|
if len > length(res) then
|
|
|
len := length(res);
|
|
@@ -1214,7 +1214,7 @@ begin
|
|
|
len := length(src);
|
|
|
{ make sure we don't dereference src if it can be nil (JM) }
|
|
|
if len > 0 then
|
|
|
- widestringmanager.ansi2widemoveproc(pchar(@src[1]),temp,len);
|
|
|
+ widestringmanager.ansi2widemoveproc(pchar(@src[1]),StringCodePage(src),temp,len);
|
|
|
len := length(temp);
|
|
|
if len > length(res) then
|
|
|
len := length(res);
|
|
@@ -1235,7 +1235,7 @@ begin
|
|
|
len := length(src);
|
|
|
{ make sure we don't access char 1 if length is 0 (JM) }
|
|
|
if len > 0 then
|
|
|
- widestringmanager.ansi2widemoveproc(pchar(@src[1]),temp,len);
|
|
|
+ widestringmanager.ansi2widemoveproc(pchar(@src[1]),DefaultSystemCodePage,temp,len);
|
|
|
len := length(temp);
|
|
|
if len > length(res) then
|
|
|
len := length(res);
|
|
@@ -1392,16 +1392,17 @@ end;
|
|
|
Public functions, In interface.
|
|
|
*****************************************************************************}
|
|
|
|
|
|
-function UnicodeCharToString(S : PUnicodeChar) : AnsiString;
|
|
|
+function UnicodeCharToString(S : PUnicodeChar) : UnicodeString;
|
|
|
begin
|
|
|
result:=UnicodeCharLenToString(s,Length(UnicodeString(s)));
|
|
|
end;
|
|
|
|
|
|
+
|
|
|
function StringToUnicodeChar(const Src : AnsiString;Dest : PUnicodeChar;DestSize : SizeInt) : PUnicodeChar;
|
|
|
var
|
|
|
temp:unicodestring;
|
|
|
begin
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc(PChar(Src),temp,Length(Src));
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(PChar(Src),StringCodePage(Src),temp,Length(Src));
|
|
|
if Length(temp)<DestSize then
|
|
|
move(temp[1],Dest^,Length(temp)*SizeOf(UnicodeChar))
|
|
|
else
|
|
@@ -1414,7 +1415,7 @@ function StringToUnicodeChar(const Src : AnsiString;Dest : PUnicodeChar;DestSize
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function WideCharToString(S : PWideChar) : AnsiString;
|
|
|
+function WideCharToString(S : PWideChar) : UnicodeString;
|
|
|
begin
|
|
|
result:=WideCharLenToString(s,Length(WideString(s)));
|
|
|
end;
|
|
@@ -1424,7 +1425,7 @@ function StringToWideChar(const Src : AnsiString;Dest : PWideChar;DestSize : Siz
|
|
|
var
|
|
|
temp:widestring;
|
|
|
begin
|
|
|
- widestringmanager.Ansi2WideMoveProc(PChar(Src),temp,Length(Src));
|
|
|
+ widestringmanager.Ansi2WideMoveProc(PChar(Src),StringCodePage(Src),temp,Length(Src));
|
|
|
if Length(temp)<DestSize then
|
|
|
move(temp[1],Dest^,Length(temp)*SizeOf(WideChar))
|
|
|
else
|
|
@@ -1433,45 +1434,62 @@ function StringToWideChar(const Src : AnsiString;Dest : PWideChar;DestSize : Siz
|
|
|
Dest[DestSize-1]:=#0;
|
|
|
|
|
|
result:=Dest;
|
|
|
-
|
|
|
end;
|
|
|
|
|
|
|
|
|
function UnicodeCharLenToString(S : PUnicodeChar;Len : SizeInt) : UnicodeString;
|
|
|
begin
|
|
|
- //SetLength(result,Len);
|
|
|
- widestringmanager.Unicode2AnsiMoveproc(S,result,Len);
|
|
|
+ SetLength(result,Len);
|
|
|
+ Move(S^,Pointer(Result)^,Len*2);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+procedure UnicodeCharLenToStrVar(Src : PUnicodeChar;Len : SizeInt;out Dest : UnicodeString);
|
|
|
+ begin
|
|
|
+ Dest:=UnicodeCharLenToString(Src,Len);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure UnicodeCharLenToStrVar(Src : PUnicodeChar;Len : SizeInt;out Dest : AnsiString);
|
|
|
begin
|
|
|
- Dest:=UnicodeCharLenToString(Src,Len);
|
|
|
+ Dest:=UnicodeCharLenToString(Src,Len);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure UnicodeCharToStrVar(S : PUnicodeChar;out Dest : AnsiString);
|
|
|
begin
|
|
|
- Dest:=UnicodeCharToString(S);
|
|
|
+ Dest:=UnicodeCharToString(S);
|
|
|
end;
|
|
|
|
|
|
|
|
|
function WideCharLenToString(S : PWideChar;Len : SizeInt) : UnicodeString;
|
|
|
begin
|
|
|
- //SetLength(result,Len);
|
|
|
- widestringmanager.Wide2AnsiMoveproc(S,result,Len);
|
|
|
+ SetLength(result,Len);
|
|
|
+ Move(S^,Pointer(Result)^,Len*2);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+procedure WideCharLenToStrVar(Src : PWideChar;Len : SizeInt;out Dest : UnicodeString);
|
|
|
+ begin
|
|
|
+ Dest:=WideCharLenToString(Src,Len);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure WideCharLenToStrVar(Src : PWideChar;Len : SizeInt;out Dest : AnsiString);
|
|
|
begin
|
|
|
- Dest:=WideCharLenToString(Src,Len);
|
|
|
+ Dest:=WideCharLenToString(Src,Len);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+procedure WideCharToStrVar(S : PWideChar;out Dest : UnicodeString);
|
|
|
+ begin
|
|
|
+ Dest:=WideCharToString(S);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure WideCharToStrVar(S : PWideChar;out Dest : AnsiString);
|
|
|
begin
|
|
|
- Dest:=WideCharToString(S);
|
|
|
+ Dest:=WideCharToString(S);
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -1692,7 +1710,13 @@ var
|
|
|
begin
|
|
|
SetLength(S,Len);
|
|
|
If (Buf<>Nil) and (Len>0) then
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc(Buf,S,Len);
|
|
|
+ begin
|
|
|
+ BufLen := IndexByte(Buf^, Len+1, 0);
|
|
|
+ If (BufLen>0) and (BufLen < Len) then
|
|
|
+ Len := BufLen;
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc(Buf,DefaultSystemCodePage,S,Len);
|
|
|
+ //PUnicodeChar(Pointer(S)+Len*sizeof(UnicodeChar))^:=#0;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -2355,13 +2379,13 @@ function UTF8Decode(const s : UTF8String): UnicodeString;
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function AnsiToUtf8(const s : ansistring): UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
|
|
|
+function AnsiToUtf8(const s : RawByteString): UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
|
|
|
begin
|
|
|
Result:=Utf8Encode(s);
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function Utf8ToAnsi(const s : UTF8String) : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
|
|
|
+function Utf8ToAnsi(const s : UTF8String) : RawByteString;{$ifdef SYSTEMINLINE}inline;{$endif}
|
|
|
begin
|
|
|
Result:=Utf8Decode(s);
|
|
|
end;
|
|
@@ -2530,7 +2554,7 @@ procedure unimplementedunicodestring;
|
|
|
|
|
|
function StringElementSize(const S: UnicodeString): Word; overload;
|
|
|
begin
|
|
|
- if assigned(S) then
|
|
|
+ if assigned(Pointer(S)) then
|
|
|
Result:=PUnicodeRec(pointer(S)-UnicodeFirstOff)^.ElementSize
|
|
|
else
|
|
|
Result:=SizeOf(UnicodeChar);
|
|
@@ -2539,7 +2563,7 @@ function StringElementSize(const S: UnicodeString): Word; overload;
|
|
|
|
|
|
function StringRefCount(const S: UnicodeString): SizeInt; overload;
|
|
|
begin
|
|
|
- if assigned(S) then
|
|
|
+ if assigned(Pointer(S)) then
|
|
|
Result:=PUnicodeRec(pointer(S)-UnicodeFirstOff)^.Ref
|
|
|
else
|
|
|
Result:=SizeOf(UnicodeChar);
|
|
@@ -2548,7 +2572,7 @@ function StringRefCount(const S: UnicodeString): SizeInt; overload;
|
|
|
|
|
|
function StringCodePage(const S: UnicodeString): TSystemCodePage; overload;
|
|
|
begin
|
|
|
- if assigned(S) then
|
|
|
+ if assigned(Pointer(S)) then
|
|
|
Result:=PUnicodeRec(pointer(S)-UnicodeFirstOff)^.CodePage
|
|
|
else
|
|
|
Result:=SizeOf(UnicodeChar);
|
|
@@ -2577,8 +2601,8 @@ function CompareTextUnicodeString(const s1, s2 : UnicodeString): PtrInt;
|
|
|
procedure initunicodestringmanager;
|
|
|
begin
|
|
|
{$ifndef HAS_WIDESTRINGMANAGER}
|
|
|
- widestringmanager.Unicode2AnsiMoveProc:=@defaultUnicode2AnsiMove;
|
|
|
- widestringmanager.Ansi2UnicodeMoveProc:=@defaultAnsi2UnicodeMove;
|
|
|
+ widestringmanager.Unicode2AnsiMoveProc:=@DefaultUnicode2AnsiMove;
|
|
|
+ widestringmanager.Ansi2UnicodeMoveProc:=@DefaultAnsi2UnicodeMove;
|
|
|
widestringmanager.UpperUnicodeStringProc:=@GenericUnicodeCase;
|
|
|
widestringmanager.LowerUnicodeStringProc:=@GenericUnicodeCase;
|
|
|
{$endif HAS_WIDESTRINGMANAGER}
|