diff --git a/packages/fcl-json/src/fpjson.pp b/packages/fcl-json/src/fpjson.pp
index 75d889ba35..46893ddc99 100644
--- a/packages/fcl-json/src/fpjson.pp
+++ b/packages/fcl-json/src/fpjson.pp
@@ -2496,7 +2496,7 @@ begin
vtChar : Result:=CreateJSON(VChar);
vtExtended : Result:=CreateJSON(VExtended^);
vtString : Result:=CreateJSON(vString^);
- vtAnsiString : Result:=CreateJSON(AnsiString(vAnsiString));
+ vtAnsiString : Result:=CreateJSON(UTF8Decode(StrPas(VPChar)));
vtPChar : Result:=CreateJSON(StrPas(VPChar));
vtPointer : If (VPointer<>Nil) then
TJSONData.DoError(SErrPointerNotNil,[SourceType])
@@ -3153,7 +3153,7 @@ constructor TJSONObject.Create(const Elements: array of {$ifdef pas2js}jsvalue{$
Var
I : integer;
- AName : String;
+ AName : TJSONUnicodeStringType;
J : TJSONData;
begin
@@ -3173,7 +3173,7 @@ begin
Case VType of
vtChar : AName:=VChar;
vtString : AName:=vString^;
- vtAnsiString : AName:=(AnsiString(vAnsiString));
+ vtAnsiString : AName:=UTF8Decode(StrPas(VPChar));
vtPChar : AName:=StrPas(VPChar);
else
DoError(SErrNameMustBeString,[I+1]);
@@ -3183,7 +3183,7 @@ begin
DoError(SErrNameMustBeString,[I+1]);
Inc(I);
J:=VarRecToJSON(Elements[i],'Object');
- Add(AName,J);
+ Add(UTF8Encode(AName),J);
Inc(I);
end;
end;
diff --git a/packages/fcl-json/src/jsonconf.pp b/packages/fcl-json/src/jsonconf.pp
index 0598b548cd..794c796e99 100644
--- a/packages/fcl-json/src/jsonconf.pp
+++ b/packages/fcl-json/src/jsonconf.pp
@@ -90,13 +90,21 @@ type
Procedure EnumValues(Const APath : UnicodeString; List : TStrings);
function GetValue(const APath: UnicodeString; const ADefault: UnicodeString): UnicodeString; overload;
+ function GetValue(const APath: RawByteString; const ADefault: RawByteString): UnicodeString; overload;
function GetValue(const APath: UnicodeString; ADefault: Integer): Integer; overload;
+ function GetValue(const APath: RawByteString; ADefault: Integer): Integer; overload;
function GetValue(const APath: UnicodeString; ADefault: Int64): Int64; overload;
+ function GetValue(const APath: RawByteString; ADefault: Int64): Int64; overload;
function GetValue(const APath: UnicodeString; ADefault: Boolean): Boolean; overload;
+ function GetValue(const APath: RawByteString; ADefault: Boolean): Boolean; overload;
function GetValue(const APath: UnicodeString; ADefault: Double): Double; overload;
+ function GetValue(const APath: RawByteString; ADefault: Double): Double; overload;
Function GetValue(const APath: UnicodeString; AValue: TStrings; Const ADefault: String) : Boolean; overload;
+ Function GetValue(const APath: RawByteString; AValue: TStrings; Const ADefault: String) : Boolean; overload;
Function GetValue(const APath: UnicodeString; AValue: TStrings; Const ADefault: TStrings): Boolean; overload;
+
procedure SetValue(const APath: UnicodeString; const AValue: UnicodeString); overload;
+ procedure SetValue(const APath: RawByteString; const AValue: RawByteString); overload;
procedure SetValue(const APath: UnicodeString; AValue: Integer); overload;
procedure SetValue(const APath: UnicodeString; AValue: Int64); overload;
procedure SetValue(const APath: UnicodeString; AValue: Boolean); overload;
@@ -289,6 +297,12 @@ begin
end;
+function TJSONConfig.GetValue(const APath: RawByteString; const ADefault: RawByteString): UnicodeString;
+
+begin
+ Result:=GetValue(UTF8Decode(aPath),UTF8Decode(ADefault));
+end;
+
function TJSONConfig.GetValue(const APath: UnicodeString; const ADefault: UnicodeString): UnicodeString;
var
@@ -302,6 +316,12 @@ begin
Result:=ADefault;
end;
+function TJSONConfig.GetValue(const APath: RawByteString; ADefault: Integer): Integer;
+
+begin
+ Result:=GetValue(UTF8Decode(aPath),ADefault);
+end;
+
function TJSONConfig.GetValue(const APath: UnicodeString; ADefault: Integer): Integer;
var
El : TJSONData;
@@ -316,6 +336,12 @@ begin
Result:=StrToIntDef(El.AsString,ADefault);
end;
+function TJSONConfig.GetValue(const APath: RawByteString; ADefault: Int64): Int64;
+
+begin
+ Result:=GetValue(UTF8Decode(aPath),ADefault);
+end;
+
function TJSONConfig.GetValue(const APath: UnicodeString; ADefault: Int64): Int64;
var
El : TJSONData;
@@ -330,6 +356,12 @@ begin
Result:=StrToInt64Def(El.AsString,ADefault);
end;
+function TJSONConfig.GetValue(const APath: RawByteString; ADefault: Boolean): Boolean;
+
+begin
+ Result:=GetValue(UTF8Decode(aPath),ADefault);
+end;
+
function TJSONConfig.GetValue(const APath: UnicodeString; ADefault: Boolean): Boolean;
var
@@ -345,6 +377,12 @@ begin
Result:=StrToBoolDef(El.AsString,ADefault);
end;
+function TJSONConfig.GetValue(const APath: RawByteString; ADefault: Double): Double;
+
+begin
+ Result:=GetValue(UTF8Decode(aPath),ADefault);
+end;
+
function TJSONConfig.GetValue(const APath: UnicodeString; ADefault: Double): Double;
var
@@ -360,6 +398,14 @@ begin
Result:=StrToFloatDef(El.AsString,ADefault);
end;
+function TJSONConfig.GetValue(const APath: RawByteString; AValue: TStrings;
+ const ADefault: String): Boolean;
+
+begin
+ Result:=GetValue(UTF8Decode(aPath),AValue, ADefault);
+end;
+
+
function TJSONConfig.GetValue(const APath: UnicodeString; AValue: TStrings;
const ADefault: String): Boolean;
var
@@ -418,6 +464,13 @@ begin
FModified:=True;
end;
+
+procedure TJSONConfig.SetValue(const APath: RawByteString;
+ const AValue: RawByteString);
+begin
+ SetValue(UTF8Decode(APath),UTF8Decode(AValue));
+end;
+
procedure TJSONConfig.SetDeleteValue(const APath: UnicodeString; const AValue, DefValue: UnicodeString);
begin
if AValue = DefValue then
diff --git a/packages/fcl-json/src/jsonreader.pp b/packages/fcl-json/src/jsonreader.pp
index 5147538a11..ce4fbee468 100644
--- a/packages/fcl-json/src/jsonreader.pp
+++ b/packages/fcl-json/src/jsonreader.pp
@@ -36,7 +36,7 @@ Type
procedure DoError(const Msg: String);
Procedure DoParse(AtCurrent,AllowEOF: Boolean);
function GetNextToken: TJSONToken;
- function CurrentTokenString: String;
+ function CurrentTokenString: RawByteString;
function CurrentToken: TJSONToken; inline;
Procedure KeyValue(Const AKey : TJSONStringType); virtual; abstract;
@@ -203,7 +203,7 @@ begin
Result:=FScanner.CurToken;
end;
-function TBaseJSONReader.CurrentTokenString: String;
+function TBaseJSONReader.CurrentTokenString: RawByteString;
begin
If CurrentToken in [tkString,tkIdentifier,tkNumber,tkComment] then
diff --git a/packages/fcl-json/src/jsonscanner.pp b/packages/fcl-json/src/jsonscanner.pp
index eedf88a664..aa0701b53d 100644
--- a/packages/fcl-json/src/jsonscanner.pp
+++ b/packages/fcl-json/src/jsonscanner.pp
@@ -28,7 +28,7 @@ uses SysUtils, Classes;
resourcestring
SErrInvalidCharacter = 'Invalid character at line %d, pos %d: ''%s''';
SUnterminatedComment = 'Unterminated comment at line %d, pos %d: ''%s''';
- SErrOpenString = 'string exceeds end of line';
+ SErrOpenString = 'string exceeds end of line %d';
type
@@ -331,7 +331,7 @@ begin
u1:=u2;
end
end;
- #0 : Error(SErrOpenString);
+ #0 : Error(SErrOpenString,[FCurRow]);
else
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
end;
@@ -355,11 +355,11 @@ begin
else
MaybeAppendUnicode;
if FTokenStr[0] = #0 then
- Error(SErrOpenString);
+ Error(SErrOpenString,[FCurRow]);
Inc(FTokenStr);
end;
if FTokenStr[0] = #0 then
- Error(SErrOpenString);
+ Error(SErrOpenString,[FCurRow]);
MaybeAppendUnicode;
SectionLength := FTokenStr - TokenStart;
SetLength(FCurTokenString, OldLength + SectionLength);
diff --git a/packages/fcl-json/tests/jsonconftest.pp b/packages/fcl-json/tests/jsonconftest.pp
index c93dc7d94b..2ff62b18df 100644
--- a/packages/fcl-json/tests/jsonconftest.pp
+++ b/packages/fcl-json/tests/jsonconftest.pp
@@ -27,6 +27,7 @@ type
procedure TestKey;
procedure TestStrings;
procedure TestUnicodeStrings;
+ procedure TestUnicodeStrings2;
end;
implementation
@@ -352,6 +353,34 @@ begin
end;
end;
+procedure TTestJSONConfig.TestUnicodeStrings2;
+
+Const
+ utf8str = 'Größe ÄÜÖ ㎰ す 가';
+ utf8path = 'Größe/す가';
+
+Var
+ Co : TJSONCOnfig;
+
+
+begin
+ Co:=CreateConf('test.json');
+ try
+ Co.SetValue('/проверка',utf8str);
+ Co.SetValue(utf8path,'something');
+ Co.Flush;
+ finally
+ co.Free;
+ end;
+ Co:=CreateConf('test.json');
+ try
+ AssertEquals('UTF8 string read/Write',utf8str,utf8encode(Co.GetValue('/проверка','')));
+ AssertEquals('UTF8 path read/Write','something',Co.GetValue(utf8path,'something'));
+ finally
+ DeleteConf(Co,True);
+ end;
+end;
+
initialization
diff --git a/packages/fcl-json/tests/testjsonconf.lpi b/packages/fcl-json/tests/testjsonconf.lpi
index 212066ba87..3f92df3d37 100644
--- a/packages/fcl-json/tests/testjsonconf.lpi
+++ b/packages/fcl-json/tests/testjsonconf.lpi
@@ -14,9 +14,6 @@
-
-
-