mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-16 11:42:12 +08:00
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:
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user