吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 875|回复: 11
收起左侧

[求助] 官方源码,报错呢?

[复制链接]
冥界3大法王 发表于 2024-11-2 10:21
https://docwiki.embarcadero.com/CodeExamples/Sydney/en/TEncoding_(Delphi)



[Delphi] 纯文本查看 复制代码
procedure TForm15.Button1Click(Sender: TObject);
var
  LBuffer: TBytes;
  LByteOrderMark: TBytes;
  LOffset: Integer;
  LEncoding, DestEncoding: TEncoding;
  LFileStream: TFileStream;
  EncodingArray: array[0..5] of TEncoding;
begin
  LEncoding := nil;
  EncodingArray[0] := TEncoding.UTF8;
  EncodingArray[1] := TEncoding.UTF7;
  EncodingArray[2] := TEncoding.Unicode;
  EncodingArray[3] := TEncoding.Default;
  EncodingArray[4] := TEncoding.BigEndianUnicode;
  EncodingArray[5] := TEncoding.ASCII;
  DestEncoding := EncodingArray[ComboBox1.ItemIndex];
  LFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
  try
    // Read file into buffer.
    SetLength(LBuffer, LFileStream.Size);
//    LFileStream.Read(LBuffer[0], Length(LBuffer));
    LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer));

    // Identify encoding and convert buffer to UTF8.
    LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
//    for I := 0 to Length(LBuffer) - 1 do
//      Memo1.Lines.Add((LBuffer[I]));
    LBuffer := LEncoding.Convert(LEncoding, DestEncoding, LBuffer, LOffset, Length(LBuffer) - LOffset);
  finally
    LFileStream.Free;
  end;

  LFileStream := TFileStream.Create(Edit2.Text, fmCreate);
  try
    // Write an encoding byte-order mark and buffer to output file.
    LByteOrderMark := DestEncoding.GetPreamble;
    LFileStream.Write(LByteOrderMark[0], Length(LByteOrderMark));
    LFileStream.Write(LBuffer[0], Length(LBuffer));
  finally
    LFileStream.Free;
  end;
end;

procedure TForm15.FormCreate(Sender: TObject);
begin
  with ComboBox1, Items do
  begin
    Add('TEncoding.UTF8');
    Add('TEncoding.UTF7');
    Add('TEncoding.Unicode');
    Add('TEncoding.Default');
    Add('TEncoding.BigEndianUnicode');
    Add('TEncoding.ASCII');
    ItemIndex := 0;
  end;
end;



image.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2024-11-2 10:53
又运来一个:(随便打开一个utf8的txt,于是返回【936   (ANSI/OEM - 简体中文 GBK)】 正确的该是 65001才对啊。

procedure TForm15.Button1Click(Sender: TObject);
var
  Path: string;
begin
  Path := Edit1.Text;
  Memo1.Lines.LoadFromFile(Path); //编码从BOM表中读取并存储在encoding属性中。
  if Memo1.Lines.Encoding <> nil then
    Edit2.Text := Memo1.Lines.Encoding.EncodingName;
  Memo1.ScrollBars := ssVertical;
end;

procedure TForm15.Button2Click(Sender: TObject);
var
  Path: string;
  myEncoding: TEncoding;
begin
  Path := Edit1.Text;
  myEncoding := TEncoding.Default;
  if (Edit2.Text = 'ASCII') then
    myEncoding := TEncoding.ASCII;
  if (Edit2.Text = 'BigEndianUnicode') then
    myEncoding := TEncoding.BigEndianUnicode;
  if (Edit2.Text = 'Default') then
    myEncoding := TEncoding.Default;
  if (Edit2.Text = 'Unicode') then
    myEncoding := TEncoding.Unicode;
//不要使用UTF7。它没有BOM,因此无法在负载上检测到编码。
//  if (Edit2.Text = 'UTF7') then myEncoding := TEncoding.UTF7;
  if (Edit2.Text = 'UTF8') then
    myEncoding := TEncoding.UTF8;
  Memo1.Lines.SaveToFile(Path, myEncoding);
end;

procedure TForm15.Button3Click(Sender: TObject);
begin
  RichViewEdit1.LoadText(Edit1.Text, 0, 0, False, StrToInt(Edit2.Text));
  RichViewEdit1.FormatAll;
end;
 楼主| 冥界3大法王 发表于 2024-11-2 10:56
lies2014 发表于 2024-11-2 10:56
LFileStream := TFileStream.Create(Edit2.Text, fmCreate);
Edit2.Text 是空的怎么会不出错
董督秀 发表于 2024-11-2 12:01
编解码库有成品的vc源码了,不知道是否有适用于delphi的。
 楼主| 冥界3大法王 发表于 2024-11-2 12:59
lies2014 发表于 2024-11-2 10:56
LFileStream := TFileStream.Create(Edit2.Text, fmCreate);
Edit2.Text 是空的怎么会不出错

@lies2014
拜托师傅给结合上面的资料修改一下:
读取一个file到上面的内存缓冲区中
检测开始的几个字节
并case做出对应的判断。
lies2014 发表于 2024-11-2 15:47
冥界3大法王 发表于 2024-11-2 12:59
@lies2014
拜托师傅给结合上面的资料修改一下:
读取一个file到上面的内存缓冲区中

不知你要达到什么样的效果,不过有了这些信息,应该可以做很多事了

2024-11-02_153246.jpg

[Delphi] 纯文本查看 复制代码
procedure TForm1.Button1Click(Sender: TObject);
var
  sfile: TMemoryStream;
  scode: TEncoding;
  bom: Integer;
  bmarker: String;
begin
  scode := nil;
  sfile := TMemoryStream.Create;
  sfile.LoadFromFile(Edit1.Text);
  bom := TEncoding.GetBufferEncoding(sfile.Memory, scode);
  bmarker := '';
  while bom <> 0 do
  begin
    bmarker := bmarker + IntToHex(sfile.ReadByte);
    Dec(bom);
  end;
  Label1.Caption := 'EncodingName : ' + WideCharToString(pwidechar(scode.EncodingName));
  Label2.Caption := 'CodePage : ' + IntToStr(scode.CodePage);
  Label3.Caption := 'Bom Marker : ' + bmarker;
  sfile.Free;
end;             

免费评分

参与人数 1吾爱币 +4 热心值 +1 收起 理由
冥界3大法王 + 4 + 1 好的,我试试,多谢!

查看全部评分

 楼主| 冥界3大法王 发表于 2024-11-2 20:16
本帖最后由 冥界3大法王 于 2024-11-2 20:18 编辑
lies2014 发表于 2024-11-2 15:47
不知你要达到什么样的效果,不过有了这些信息,应该可以做很多事了
image.png
怎么有两行错误呢?
是不是和Delphi不兼容,说什么超载。。好像参数1 该是个数组
lies2014 发表于 2024-11-2 22:31
冥界3大法王 发表于 2024-11-2 20:16
怎么有两行错误呢?
是不是和Delphi不兼容,说什么超载。。好像参数1 该是个数组

Lazarus 写的,TMemoryStream.Memory 是个指针,TEncoding.GetBufferEncoding 需要的是TBytes
Lazarus 可以自动转换,Delphi 的指针用法不太一样,你试试用 TBytes(sfile.Memory) 强转
Delphi 中也没有 TMemoryStream.ReadByte 这么方便的方法,用 Read 先读到 Buffer 中再转换吧
fqbqrr6 发表于 2024-11-3 08:03
学C++吧,不折腾.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-5 05:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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