2Pascal-新时代的Pascal

 找回密码
 立即注册
搜索
热搜: fastreport
12
返回列表 发新帖
楼主: wang_80919
打印 上一主题 下一主题

字符串 编码 和 跨平台 讨论 01

[复制链接]

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
11#
 楼主| 发表于 2015-8-5 18:30:06 | 只看该作者
京东购书支持本站
[迁安]Nightmourn(328783896)  18:29:51
@[北京]老猫 Android转换gb2312 urlencode要怎么百度…

[北京]老猫(1765535979)  18:30:45
@[迁安]Nightmourn 此问题在中文 DELPHI 开发界(对于你们这些不懂得自己研究的人来说)尚属首次 研究,百度没有收录。

答案就是 使用 TNetEncdong.Url.Encode(TBytes 版本的参数); (很早之前,我们自己研究出的答案)

如何获取 TBytes 的结果,前面已经讨论过了。

(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

0

主题

5

帖子

32

积分

新手上路

Rank: 1

积分
32
12#
发表于 2015-8-6 15:59:58 | 只看该作者
京东数码购物支持本站
本帖最后由 soguifan 于 2015-8-7 08:28 编辑

[mw_shl_code=delphi,false]
Edit1.Text :='提交';
Edit2.Text:=httpencode(edit1.Text) ; //UTF8 urlencode结果为  %E6%8F%90%E4%BA%A4
Edit3.Text:=Tnetencoding.URL.Encode(edit1.Text);//UTF8 urlencode结果为  %E6%8F%90%E4%BA%A4
//Edit4.Text :=Tnetencoding.url.EncodeBytesToString( Tencoding.GetEncoding(936).getbytes(edit1.Text));//错误No mapping for the Unicode character exists in the target multi-byte code page.
//Edit4.Text :=Tnetencoding.url.encode(Tencoding.ansi.GetString(Tencoding.GetEncoding(936).getbytes(edit1.Text)));//UTF8 urlencode结果为  %E6%8F%90%E4%BA%A4
//请问怎么在Android显示GB2312结果为%cc%e1%bd%bb
[/mw_shl_code]


www.soguifan.com
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
13#
 楼主| 发表于 2015-8-6 18:40:41 | 只看该作者
京东数码购物支持本站
楼上的问题,太过低级,前面的讨论 综合一下,就是答案。
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
14#
 楼主| 发表于 2015-8-7 09:31:41 | 只看该作者
京东数码购物支持本站
  Input: TBytes;

  SetLength(Output, SM4_BLOCKSIZE);
  FillChar(Input[0], SM4_BLOCKSIZE, 0);

不能 FillChar(Input,

会发生非法操作。
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

0

主题

5

帖子

32

积分

新手上路

Rank: 1

积分
32
15#
发表于 2015-8-10 09:35:08 | 只看该作者
京东数码购物支持本站
本帖最后由 soguifan 于 2015-8-10 09:36 编辑
wang_80919 发表于 2015-8-7 09:31
Input: TBytes;

  SetLength(Output, SM4_BLOCKSIZE);

本人不是学计算机的,工作也与计算机无关,Delphi只是业余爱好而已。wang_80919(Flying Wang)大神所说的“太过低级”的问题,看了上边的讨论[答案就是 使用 THttpEncdong.Url.Encode(TBytes 版本的参数); (很早之前,我们自己研究出的答案)],本人菜鸟还是没看明白,THttpEncdong也不知道是什么东东,最后自己写了个函数,完成了汉字转GB2312 Urlencode。[mw_shl_code=delphi,false]
function MyUrlEncode(const input: string): string; // 汉字转Gb2312 urlencode
var
  S: string;
  Stream: TStringStream;
  B: Byte;
begin
  Result := '';
  S := '';
  try
    Stream := TStringStream.Create(input, TEncoding.GetEncoding(936));
    for B in Stream.Bytes do
      S := Format('%s%%%.2x', [S, B]);
  finally
    Stream.Free;
  end;
  Result := S;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := '提交';
  Edit2.Text := MyUrlEncode(Edit1.Text); // 结果  %cc%e1%bd%bb
end;
[/mw_shl_code]

www.soguifan.com
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
16#
 楼主| 发表于 2015-8-10 12:10:24 | 只看该作者
京东数码购物支持本站
浪费时间
你直接说找不到 THTTPEncdong
不就得了。

主要是我英文太差 不记得正确的 类名
TNetEncdong。
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
17#
 楼主| 发表于 2015-8-27 17:59:27 | 只看该作者
京东数码购物支持本站
http://bbs.2ccc.com/topic.asp?topicid=496558
大家可以看看这个帖子。
调用 DLL。也可以使用 TEncoding

function GetVerifyCode(fileName: PByte; strsn: PByte; var strCode: PByte): BOOL; stdcall; external 'GetVerifyCode.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  aFile, aSn, aCode: string;
  PFile,PSn, PCode: PByte;
  ACodes: TBytes;
begin
  aFile := 'verify_code.bin';
  aSn := '535727843';
  PFile := addr(TEncoding.ANSI.GetBytes(aFile)[0]);  //建议 GetBytes(aFile + #0)
  PSn := addr(TEncoding.ANSI.GetBytes(aSn)[0]);  //建议 GetBytes(aSn + #0)
  SetLength(ACodes, 6); //ANSI 是 6 Unicode 是 6*2。//建议多留一个字符的空间,用于存放 #0
  PCode := addr(ACodes[0]);
  if GetVerifyCode(PFile, PSn, PCode) then
  begin
    aCode := TEncoding.ANSI.GetString(ACodes);
    ShowMessage(aCode);
  end
  else
  begin
    ShowMessage('获取密码失败!');
  end;
end;
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
18#
 楼主| 发表于 2015-9-11 11:51:08 | 只看该作者
京东数码购物支持本站
对于 StringList 可以设置 读取文件 或者 读取流的 TEncoding。保存也是。
AStringList.Loadxxxxx(xxx,TEncoding.XXXX);
AStringList.Savexxxxx(xxx,TEncoding.XXXX);

还可以设置 换行的格式。
AStrignList.LineBreak := #$0A;  这是 MAC IOS 安卓下 通用的,但是 WIN 下就不行了。 所以,建议大家改为 #$0D#$0A 。这个所有平台都是回车换行。

类似于 Memo 的控件 Lines Items  都是 TStringList 。都可以自己控制读取或保存的 字符编码。
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81940
19#
 楼主| 发表于 2015-11-2 17:17:24 | 只看该作者
京东数码购物支持本站
如果 需要输入一个 PWideChar
TMarshal.InString  即可。
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|新时代Pascal论坛

GMT+8, 2024-5-4 21:30 , Processed in 0.062427 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表