Try to fix issue #693 : Import CSV file: LOAD DATA fails with UTF-16 encoded file.

Pros:
- CSV/HTML/XML exports are now encoded as UTF-8, not UTF-16. Importing such CSV files should now work magically when using the Import CSV dialog.
- Exported files should now be significanty smaller when most content is latin1 encoded.
This commit is contained in:
Ansgar Becker
2008-08-28 16:05:56 +00:00
parent 776fa891a8
commit 76f2952a84
2 changed files with 22 additions and 11 deletions

View File

@ -713,6 +713,7 @@ procedure GridToHtml(Grid: TVirtualStringTree; Title: WideString; ConvertHTMLEnt
var var
i: Integer; i: Integer;
tmp, Data, Attribs, Generator: WideString; tmp, Data, Attribs, Generator: WideString;
utf8: String;
Node: PVirtualNode; Node: PVirtualNode;
begin begin
Generator := APPNAME+' '+FullAppVersion; Generator := APPNAME+' '+FullAppVersion;
@ -738,7 +739,8 @@ begin
tmp := tmp + ' <th style="width:'+IntToStr(Grid.Header.Columns[i].Width)+'px">' + Grid.Header.Columns[i].Text + '</th>' + CRLF; tmp := tmp + ' <th style="width:'+IntToStr(Grid.Header.Columns[i].Width)+'px">' + Grid.Header.Columns[i].Text + '</th>' + CRLF;
end; end;
tmp := tmp + ' </tr>' + CRLF; tmp := tmp + ' </tr>' + CRLF;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Node := Grid.GetFirst; Node := Grid.GetFirst;
while Assigned(Node) do begin while Assigned(Node) do begin
@ -761,7 +763,8 @@ begin
tmp := tmp + ' <td'+Attribs+'>' + Data + '</td>' + CRLF; tmp := tmp + ' <td'+Attribs+'>' + Data + '</td>' + CRLF;
end; end;
tmp := tmp + ' </tr>' + CRLF; tmp := tmp + ' </tr>' + CRLF;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Node := Grid.GetNext(Node); Node := Grid.GetNext(Node);
end; end;
// footer: // footer:
@ -769,7 +772,8 @@ begin
'<em>generated ' + DateToStr(now) + ' ' + TimeToStr(now) + '<em>generated ' + DateToStr(now) + ' ' + TimeToStr(now) +
' by <a href="'+APPDOMAIN+'">' + Generator + '</a></em></p>' + CRLF + CRLF + ' by <a href="'+APPDOMAIN+'">' + Generator + '</a></em></p>' + CRLF + CRLF +
'</body></html>'; '</body></html>';
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Mainform.Showstatus(STATUS_MSG_READY); Mainform.Showstatus(STATUS_MSG_READY);
end; end;
@ -786,6 +790,7 @@ procedure GridToCsv(Grid: TVirtualStringTree; Separator, Encloser, Terminator: S
var var
i: Integer; i: Integer;
tmp, Data: WideString; tmp, Data: WideString;
utf8: String;
Node: PVirtualNode; Node: PVirtualNode;
begin begin
separator := esc2ascii(separator); separator := esc2ascii(separator);
@ -802,7 +807,8 @@ begin
tmp := tmp + Separator; tmp := tmp + Separator;
tmp := tmp + Encloser + Grid.Header.Columns[i].Text + Encloser; tmp := tmp + Encloser + Grid.Header.Columns[i].Text + Encloser;
end; end;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
// Data: // Data:
Node := Grid.GetFirst; Node := Grid.GetFirst;
@ -820,7 +826,8 @@ begin
Data := FloatStr(Data); Data := FloatStr(Data);
tmp := tmp + Encloser + Data + Encloser + Separator; tmp := tmp + Encloser + Data + Encloser + Separator;
end; end;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Node := Grid.GetNext(Node); Node := Grid.GetNext(Node);
end; end;
Mainform.showstatus(STATUS_MSG_READY); Mainform.showstatus(STATUS_MSG_READY);
@ -837,11 +844,13 @@ procedure GridToXml(Grid: TVirtualStringTree; root: WideString; S: TStream);
var var
i: Integer; i: Integer;
tmp, Data: WideString; tmp, Data: WideString;
utf8: String;
Node: PVirtualNode; Node: PVirtualNode;
begin begin
tmp := '<?xml version="1.0"?>' + CRLF + CRLF + tmp := '<?xml version="1.0"?>' + CRLF + CRLF +
'<'+root+'>' + CRLF; '<'+root+'>' + CRLF;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Node := Grid.GetFirst; Node := Grid.GetFirst;
while Assigned(Node) do begin while Assigned(Node) do begin
@ -862,12 +871,14 @@ begin
tmp := tmp + #9#9'<'+Grid.Header.Columns[i].Text+'>' + Data + '</'+Grid.Header.Columns[i].Text+'>' + CRLF; tmp := tmp + #9#9'<'+Grid.Header.Columns[i].Text+'>' + Data + '</'+Grid.Header.Columns[i].Text+'>' + CRLF;
end; end;
tmp := tmp + #9'</row>' + CRLF; tmp := tmp + #9'</row>' + CRLF;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Node := Grid.GetNext(Node); Node := Grid.GetNext(Node);
end; end;
// footer: // footer:
tmp := '</'+root+'>' + CRLF; tmp := '</'+root+'>' + CRLF;
S.Write(tmp[1], Length(tmp) * Sizeof(WideChar)); utf8 := Utf8Encode(tmp);
S.Write(utf8[1], Length(utf8));
Mainform.showstatus(STATUS_MSG_READY); Mainform.showstatus(STATUS_MSG_READY);
end; end;
@ -2463,12 +2474,12 @@ end;
procedure StreamToClipboard(S: TMemoryStream); procedure StreamToClipboard(S: TMemoryStream);
var var
Content: WideString; Content: String;
begin begin
SetLength(Content, S.Size); SetLength(Content, S.Size);
S.Position := 0; S.Position := 0;
S.Read(Pointer(Content)^, S.Size); S.Read(Pointer(Content)^, S.Size);
CopyToClipboard(Content); CopyToClipboard(Utf8Decode(Content));
// Free memory // Free memory
SetString(Content, nil, 0); SetString(Content, nil, 0);
end; end;

View File

@ -1179,7 +1179,7 @@ begin
if Dialog.Execute and (Dialog.FileName <> '') then try if Dialog.Execute and (Dialog.FileName <> '') then try
Screen.Cursor := crHourGlass; Screen.Cursor := crHourGlass;
FS := CreateUnicodeFileStream(Dialog.FileName); FS := openfs(Dialog.FileName);
case Dialog.FilterIndex of case Dialog.FilterIndex of
1: GridToCsv(Grid, Dialog.FieldSep, Dialog.FieldEncl, Dialog.LineSep, FS); 1: GridToCsv(Grid, Dialog.FieldSep, Dialog.FieldEncl, Dialog.LineSep, FS);
2: GridToHtml(Grid, Title, Dialog.ConvertHTMLSpecialChars, FS); 2: GridToHtml(Grid, Title, Dialog.ConvertHTMLSpecialChars, FS);