delphi 在用记事本生成txt文件时如何控制"另存为"里的"编码"选项?
我想控制编码为UTF-8不是ANSI等其它编码,谢谢!!

解决方案 »

  1.   

    delphi 在用记事本生成txt文件时如何选择"另存为"里的"编码"选项? 
    我想控制编码为UTF-8不是ANSI等其它编码,谢谢!! 
      

  2.   

    delphi 在用记事本生成txt文件时如何选择"另存为"里的"编码"选项? 
    我想选择编码为UTF-8不是ANSI等其它编码. 
    代码转换要怎么写啊?
    各位大虾帮帮忙啊!!
      

  3.   

    delphi中有AnsiToUtf8 和Utf8ToAnsi函数你自己
      

  4.   

    首先谢谢yuqianyi1997,这个函数我也找到了.因我是一个delphi初学者,我写了一段程序:
    procedure TForm1.Button1Click(Sender: TObject);
    var   F:textfile;
      begin
          assignfile(F,'c:\test.txt');
          rewrite(F);
          Writeln(F,'我再来试试编码转换');
          closefile(F);
      end;
    end.
    生成的test.txt是以ANSI编码写的.
    我还写了一段程序代码:
    procedure TForm1.Button1Click(Sender: TObject);
    var  S:string;
    begin
     with   TMemoryStream.Create   do   try
          S   :=   #$EF#$BB#$BF;
          Write(S[1],   Length(S));
          S   :=   AnsiToUtf8('我来试试编码转换');
          Write(S[1],   Length(S));
          Position   :=   0;
          SaveToFile('c:\test.txt');
          finally
          free;
          end;
     end;
    end.
    生成的test.txt是以UTF-8编码写的.
    现在关键是怎么样在第一段程序中修改使ANSI编码转为UTF-8编码?
    高手们能帮帮忙,谢谢!
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject); 
    var  S:string; 
    begin 
    with  TMemoryStream.Create  do  try 
          S  :=  #$EF#$BB#$BF; 
          Write(S[1],  Length(S)); 
          S  :=  AnsiToUtf8('我来试试编码转换'); 
          Write(S[1],  Length(S)); 
          Position  :=  0; 
          SaveToFile('c:\test.txt'); 
          finally 
          free; 
          end; 
    end; 
    end. 
    这个不就可以吗? 
      

  6.   

    //Unicode存、取
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
      W: WideString;
    begin
      if Memo1.Text = '' then Exit;  //存
      with TMemoryStream.Create do try
        S := #$FF#$FE;
        Write(S[1], Length(S));
        W := Memo1.Text;
        Write(W[1], Length(W) * SizeOf(WideChar));
        Position := 0;
        SaveToFile('c:\temp\temp.txt');
      finally
        Free;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      S: string;
      W: WideString;
    begin  //取
      if not FileExists('c:\temp\temp.txt') then Exit;
      with TMemoryStream.Create do try
        LoadFromFile('c:\temp\temp.txt');
        if Size < 4 then Exit;
        SetLength(S, 2);
        Read(S[1], Length(S));
        if Copy(S, 1, 2) <> #$FF#$FE then Exit;
        SetLength(W, (Size - 2) div SizeOf(WideChar));
        Read(W[1], Length(W) * SizeOf(WideChar));
        Memo2.Text := W;
      finally
        Free;
      end;
    end;//Utf8存、取
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
    begin  //存
      with TMemoryStream.Create do try
        S := #$EF#$BB#$BF;
        Write(S[1], Length(S));
        S := AnsiToUtf8(Memo1.Text);
        Write(S[1], Length(S));
        Position := 0;
        SaveToFile('c:\temp\temp.txt');
      finally
        Free;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);var  S: string;
    begin  //取
      if not FileExists('c:\temp\temp.txt') then Exit;
      with TMemoryStream.Create do try
        LoadFromFile('c:\temp\temp.txt');
        SetLength(S, Size);
        Read(S[1], Length(S));
        if Copy(S, 1, 3) <> #$EF#$BB#$BF then Exit;
        Memo2.Text := Utf8ToAnsi(Copy(S, 4, MaxInt));
      finally
        Free;
      end;
    end;要在文件对话框中加一个选项挺难,这得参考TOpenPictureDialog的封装
      

  7.   

    多谢zswang!
    我现在关键是想问由下面程序:
    procedure TForm1.Button1Click(Sender: TObject); 
    var  F:textfile; 
      begin 
          assignfile(F,'c:\test.txt'); 
          rewrite(F); 
          Writeln(F,'我再来试试编码转换'); 
          closefile(F); 
      end; 
    end. 
    形成的c:\test.txt文件,怎么进行编码转换.
    即在上面程序的基础上进行修改,而不是重新写成:
    procedure TForm1.Button1Click(Sender: TObject); 
    var  S:string; 
    begin 
    with  TMemoryStream.Create  do  try 
          S  :=  #$EF#$BB#$BF; 
          Write(S[1],  Length(S)); 
          S  :=  AnsiToUtf8('我再来试试编码转换'); 
          Write(S[1],  Length(S)); 
          Position  :=  0; 
          SaveToFile('c:\test.txt'); 
          finally 
          free; 
          end; 
    end; 
    end. 
    的形式;
    关键是怎么样在第一段程序中修改使ANSI编码转为UTF-8编码,高手们帮帮忙? 
    因为我实际形成的c:\test.txt文件很大,并且是通过较为复杂的分步骤多次写入形成,只是编码为ANSI,我现在就是想把这个已经形成的编码为ANSI的c:\test.txt文件,通过修改程序改变为UTF-8编码形式.
    所以,简要的写了第一段小程序,看看高手们能不能帮帮忙,在第一段小程序中修改,使c:\test.txt文件成为编码为UTF-8的形式.谢谢!
      

  8.   

    在utf8中一个汉字占3个字节;
    而在gb2312中一个汉字占2个字节。所以,这样编码转换只要出现汉字则文件大小必然发生变化。
    如果文件在1M左右,基本没有感觉,测试上面的代码再说吧。
      

  9.   

    记事本依靠文件的前几个字节标示编码
    生成其它格式的文件时,需要先指定编码
    var
      F : Integer;
      EncodeFlag : array [0..2] of Byte;
      s : UTF8String;
    begin
      EncodeFlag[0] := $ef;
      EncodeFlag[1] := $bb;
      EncodeFlag[2] := $bf;
      (**************************************************
       ansi                               没有标记
       Unicode                            $FF $FE
       Unicode big endian                 $FE $FF
       UTF-8                              $EF $BB $BF
      **************************************************)
      F := FileCreate('D:\utf8.txt');
      FileSeek(F,0,0);
      FileWrite(F,EncodeFlag,Length(EncodeFlag));
      s := AnsiToUtf8('中文测试');
      FileWrite(F,s[1],Length(s));
      FileClose(F);
    end;
      

  10.   

    要转换的话,你可以用TStringList一次读取整个文件,然后将Tstringlist.text传给AnsiToUtf8
    也可以使用readln一次读取一行,传给AnsiToUtf8,再写入目标文件
      

  11.   

    十分感谢SDZENG!
    我是一个delphi初学者,请问如何用TStringList一次读取整个文件?
    比如说:用TStringList如何读取'D:\utf8.txt'中的'中文测试'呢??
      

  12.   


    var
      AnsiFile : TStringList;
      AnsiText : string;  Utf8File : Integer;
      EncodeFlag : array [0..2] of Byte;
      Utf8Text : UTF8String;
      iFileLen : Integer;
    begin
      if FileExists('D:\ansi.txt') then
        DeleteFile('D:\ansi.txt');  AnsiFile := TStringList.Create;  //创建ansi文件
      AnsiFile.Add('中文测试');
      AnsiFile.SaveToFile('D:\ansi.txt');  //读ansi文件
      AnsiFile.LoadFromFile('D:\ansi.txt');
      AnsiText := AnsiFile.Text;  AnsiFile.Free;  //创建utf8文件
      EncodeFlag[0] := $ef;
      EncodeFlag[1] := $bb;
      EncodeFlag[2] := $bf;  Utf8File := FileCreate('D:\utf8.txt');
      FileSeek(Utf8File,0,0);
      FileWrite(Utf8File,EncodeFlag,Length(EncodeFlag));  //ansi转换成utf8
      Utf8Text := AnsiToUtf8(AnsiText);  //写Utf8文件
      FileWrite(Utf8File,Utf8Text[1],Length(Utf8Text));
      FileClose(Utf8File);
      Utf8Text := '';  //读取Utf8文件
      Utf8File := FileOpen('D:\utf8.txt',fmOpenRead);
      iFileLen := FileSeek(Utf8File,0,2);
      FileSeek(Utf8File,3,0);
      SetLength(Utf8Text,iFileLen-3);
      FileRead(Utf8File,Utf8Text[1],iFileLen-3);  //显示读取到的文本
      AnsiText := Utf8ToAnsi(Utf8Text);
      ShowMessage(AnsiText);