Delphi7及其以下版本的 VCL 只支持 Ansi, 所以... WideString 与 UTF8String (定义与 AnsiString 相同) 并没有办法正确的在 VCL 中显示
Delphi7自带的utf-8转换函数遇到其无法识别的字符串就返回空。
用以下转换函数可以解决这个bug
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
unit util_utf8; interface uses Windows; type UTF8String = AnsiString ; function AnsiToWide( const S: AnsiString ): WideString ; function WideToUTF8( const WS: WideString ): UTF8String; function AnsiToUTF8( const S: AnsiString ): UTF8String; function UTF8ToWide( const US: UTF8String): WideString ; function WideToAnsi( const WS: WideString ): AnsiString ; function UTF8ToAnsi( const S: UTF8String): AnsiString ; implementation function AnsiToWide( const S: AnsiString ): WideString ; var len: integer ; ws: WideString ; begin Result:= '' ; if (Length(S) = 0 ) then exit; len:=MultiByteToWideChar(CP_ACP, 0 , PChar (s), - 1 , nil , 0 ); SetLength(ws, len); MultiByteToWideChar(CP_ACP, 0 , PChar (s), - 1 , PWideChar (ws), len); Result:=ws; end ; function WideToUTF8( const WS: WideString ): UTF8String; var len: integer ; us: UTF8String; begin Result:= '' ; if (Length(WS) = 0 ) then exit; len:=WideCharToMultiByte(CP_UTF8, 0 , PWideChar (WS), - 1 , nil , 0 , nil , nil ); SetLength(us, len); WideCharToMultiByte(CP_UTF8, 0 , PWideChar (WS), - 1 , PChar (us), len, nil , nil ); Result:=us; end ; function AnsiToUTF8( const S: AnsiString ): UTF8String; begin Result:=WideToUTF8(AnsiToWide(S)); end ; function UTF8ToWide( const US: UTF8String): WideString ; var len: integer ; ws: WideString ; begin Result:= '' ; if (Length(US) = 0 ) then exit; len:=MultiByteToWideChar(CP_UTF8, 0 , PChar (US), - 1 , nil , 0 ); SetLength(ws, len); MultiByteToWideChar(CP_UTF8, 0 , PChar (US), - 1 , PWideChar (ws), len); Result:=ws; end ; function WideToAnsi( const WS: WideString ): AnsiString ; var len: integer ; s: AnsiString ; begin Result:= '' ; if (Length(WS) = 0 ) then exit; len:=WideCharToMultiByte(CP_ACP, 0 , PWideChar (WS), - 1 , nil , 0 , nil , nil ); SetLength(s, len); WideCharToMultiByte(CP_ACP, 0 , PWideChar (WS), - 1 , PChar (s), len, nil , nil ); Result:=s; end ; function UTF8ToAnsi( const S: UTF8String): AnsiString ; begin Result:=WideToAnsi(UTF8ToWide(S)); end ; end . |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm1 = class (TForm) Button1: TButton; Memo1: TMemo; IdHTTP1: TIdHTTP; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end ; var Form1: TForm1; implementation uses util_utf8; {$R *.dfm} procedure TForm1 . Button1Click(Sender: TObject); var strm: TStringStream; begin strm := TStringStream . Create( '' ); try Memo1 . Clear; Memo1 . Lines . Add(UTF8ToAnsi(strm . DataString)); finally strm . Free; end ; end ; end . |
窗体文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
object Form1: TForm1 Left = 206 Top = 211 Width = 783 Height = 540 Caption = 'Form1' Color = clBtnFace Font . Charset = DEFAULT_CHARSET Font . Color = clWindowText Font . Height = - 11 Font . Name = 'MS Sans Serif' Font . Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 56 Top = 40 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object Memo1: TMemo Left = 24 Top = 88 Width = 737 Height = 409 Lines . Strings = ( 'Memo1' ) ScrollBars = ssVertical TabOrder = 1 end object IdHTTP1: TIdHTTP MaxLineAction = maException ReadTimeout = 0 AllowCookies = True ProxyParams . BasicAuthentication = False ProxyParams . ProxyPort = 0 Request . ContentLength = - 1 Request . ContentRangeEnd = 0 Request . ContentRangeStart = 0 Request . ContentType = 'text/html' Request . Accept = 'text/html, */*' Request . BasicAuthentication = False Request . UserAgent = 'Mozilla/3.0 (compatible; Indy Library)' HTTPOptions = [hoForceEncodeParams] Left = 240 Top = 48 end end |
测试效果:
此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/70524.html