2
0
Эх сурвалжийг харах

* Explicitly use UTF8, fix bug ID #36231: RTF export must write unicode chars escaped

git-svn-id: trunk@43356 -
michael 5 жил өмнө
parent
commit
c6f53adf89

+ 10 - 10
packages/fcl-db/src/export/fpdbexport.pp

@@ -156,8 +156,8 @@ Type
     Procedure DoProgress(ItemNo : Integer); Virtual;
     // Override if each field can be written as-is.
     Procedure ExportField(EF : TExportFieldItem); virtual;
-    // Format field as string, according to settings
-    Function FormatField(F : TField) : String; virtual;
+    // Format field as UTF8 string, according to settings
+    Function FormatField(F : TField) : UTF8String; virtual;
     // Raise EDataExporter error
     Procedure ExportError(Msg : String); overload;
     Procedure ExportError(Fmt : String; Args: Array of const); overload;
@@ -581,7 +581,7 @@ begin
   // Do nothing
 end;
 
-Function TCustomDatasetExporter.FormatField(F: TField) : String;
+Function TCustomDatasetExporter.FormatField(F: TField) : UTF8String;
 
 Var
   FS : TFormatSettings;
@@ -594,7 +594,7 @@ begin
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
     else
-      Result:=F.AsString;  
+      Result:=F.AsUTF8String;  
     end
   else if (F.DataType=ftBoolean) then
     begin
@@ -606,7 +606,7 @@ begin
       if FormatSettings.UseDisplayText then
         Result:=F.DisplayText
       else
-        Result:=F.AsString;  
+        Result:=F.AsUTF8String;
     end
   else if (F.DataType=ftDate) then
     begin
@@ -615,7 +615,7 @@ begin
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
     else
-      Result:=F.AsString;
+      Result:=F.AsUTF8String;
     end
   else if (F.DataType=ftTime) then
     begin
@@ -624,7 +624,7 @@ begin
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
     else
-      Result:=F.AsString;  
+      Result:=F.AsUTF8String;
     end
   else if (F.DataType in [ftDateTime,ftTimeStamp]) then
     begin
@@ -633,7 +633,7 @@ begin
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
     else
-      Result:=F.AsString;
+      Result:=F.AsUTF8String;
     end 
   else if (F.DataType=ftCurrency) then
     begin
@@ -646,12 +646,12 @@ begin
     else  if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
     else 
-      Result:=F.AsString;
+      Result:=F.AsUTF8String;
     end
   else if FormatSettings.UseDisplayText then
     Result:=F.DisplayText
   else
-    Result:=F.AsString;  
+    Result:=F.AsUTF8String;
 end;
 
 procedure TCustomDatasetExporter.ExportError(Msg: String);

+ 18 - 20
packages/fcl-db/src/export/fprtfexport.pp

@@ -50,10 +50,10 @@ Type
     FTH : String; // Table header row
     FTN : String; // Tabular environment name (for closing)
     function GetRTFFormatsettings: TRTFExportFormatSettings;
-    function MakeCell(S: String; LineBefore, LineAfter: Boolean): string;
+    function MakeCell(S: UTF8String; LineBefore, LineAfter: Boolean): string;
     procedure SetRTFFormatSettings(const AValue: TRTFExportFormatSettings);
   Protected
-    function EscapeRTF(S: String): String;
+    function EscapeRTF(S: UTF8String): String;
     procedure OutputRow(const ARow: String); virtual;
     procedure OutputTableEnd; virtual;
     procedure OutputTableStart; virtual;
@@ -108,29 +108,27 @@ begin
 end;
 
 { TCustomRTFExporter }
-function TCustomRTFExporter.EscapeRTF(S: String): String;
+function TCustomRTFExporter.EscapeRTF(S: UTF8String): String;
 
-Var
-  I,J,L : Integer;
-  P : Pchar;
+Const
+  NeedEscape : TSysCharSet = ['{', '}', '\'];
+
+var
+  SS : UnicodeString;
+  Ch : UnicodeChar;
 
 begin
-  I:=1;
-  J:=1;
+  SS:=UTF8Decode(S);
   Result:='';
-  L:=Length(S);
-  P:=PChar(S);
-  While I<=L do
+  For Ch in SS do
     begin
-    if (P^ in ['\','{','}']) then
-      begin
-      Result:=Result+Copy(S,J,I-J)+'\'+P^;
-      J:=I+1;
-      end;
-    Inc(I);
-    Inc(P);
+    if CharInSet(Ch, NeedEscape) then
+      Result:=Result+'\';
+    if Ord(Ch)>255 then
+      Result:=Result+'\u'+IntToStr(Ord(Ch))+'?'
+    else
+      Result:=Result+Utf8Encode(Ch);
     end;
-  Result:=Result+Copy(S,J,I-1);
 end;
 
 function TCustomRTFExporter.GetRTFFormatsettings: TRTFExportFormatSettings;
@@ -275,7 +273,7 @@ begin
   inherited DoDataRowStart;
 end;
 
-Function TCustomRTFExporter.MakeCell(S : String; LineBefore,LineAfter : Boolean) : string;
+Function TCustomRTFExporter.MakeCell(S : UTF8String; LineBefore,LineAfter : Boolean) : string;
 
 begin
   Result:='\pard\intbl '+EscapeRTF(S)+'\cell';