rt

解决方案 »

  1.   

    procedure TGBUCS.GB_USC2 (var ascString : string);
    var
      ascLen,i : integer;
      tu : WideString;
      c : char;
    begin
      tu := ascString;
      SetLength (ascString,Length (tu) * 2);
      ascLen := Length (ascString);
      CopyMemory (@ascString[1],@tu[1],ascLen);
      for i := 1 to ascLen div 2 do
      begin
        c := ascString[i * 2 - 1];
        ascString[i * 2 - 1] := ascString[i * 2];
        ascString[i * 2] := c;
      end;
    end;
      

  2.   

    你这个过程有什么作用呢?其实换个说法:如何将一字符串写入一个unicode编码的文本文件?
      

  3.   

    AnsiToUTF8
    UTF8ToUnicode
    看一下这两个函数的帮助。
      

  4.   

    还有这个,可能这个更符合你的要求:
    StringToWideChar
      

  5.   

    受不了了!!!!!!!!!!!!!!!!!
    我写的很清楚啊,
    我要把文本文件转为unicode编码.
    比如原文件a.txt(ansi编码),现在我要把它改成a.txt(unicode编码),而且a.txt内容不变。你们给我的都是字符串的转换函数。
      

  6.   

    我给你的并没有错,你照我上面说的做。
    你可以用一个TStringList将文本文件Load进来,然后声明一个WideString变量,最后调用上面的StringToWideChar,转换后的信息保存在WideString中。
    再声明一个MemoryStream将WideString写进流中。
    最后将流保存为一个文本文件。你去文件文件看,它就是Unicode编码的,且信息一样。这就是在程序中的方法,信不信由你!
      

  7.   

    厚厚
    以前我也为ansi和unicode的转换,看遍了这些函数,其实最简单的方法就是
    Ansi->Unicode   
       strUnicode := WideString(strAnsi);Unicode->Ansi
       strAnsi := AnsiString(strUnicode);
      

  8.   

    回复人: linzhengqun(风。爱的翔舞) ( ) 信誉:100 
    谢谢你的回复,我按你的方法做,
    发现如果a.txt中都是英文字符的话就都没问题。
    如果中间有中文字符,结果就不对了。
    我之前是用filestream来读写,结果也跟这一样。procedure TForm1.Button1Click(Sender: TObject);
    var
      a:tstringlist;
      b:TMemoryStream;
      stransi:string;
      strunicode:widestring;
    begin
      a:=tstringlist.Create ;
      a.LoadFromFile('c:\a.txt');
      stransi:=a.Text ;
      a.Free;
      strunicode:=widestring(stransi);
      b:=TMemoryStream.Create ;
      b.Write(strunicode[1],length(strunicode)*2);
      b.SaveToFile('c:\b.txt');
      b.Free;
    end;
      

  9.   

    好吧,让我来解析为什么吧,那是因为每一种格式的文本在最开头都会有一个标识,标识它是什么编码。比如Unicode的最开头就是FFFE。笔记本就是根据最开头的这个标识来识别它是什么码的。而你在上面写的时候,没有将这个标识写在文件的最开头,所以你用笔记本打开的时候识别不了,不信你打开之后选另存为,就可以看到它识别为Ansi码了,所以会显示不对。正确的做法是在文件的开头写进FFFE这个标识,就可以正确显示了。下面是源码:
    var SL: TStringList;
        MM: TMemoryStream;
        AnStr: String;
        WS: WideString;
        P: PByteArray;
    begin
      SL:= TStringList.Create;
      MM:= TMemoryStream.Create;
      try
        SL.LoadFromFile('test.txt');
        AnStr:= SL.Text;
        WS:= AnStr;        //转为Unicode    //文本开头写进Unicode的标识
        GetMem(P, 2 * Sizeof(Char));
        P[0]:= $FF;
        P[1]:= $FE;
        MM.Write(P^, 2 * Sizeof(Char));    //将Unicode文本写进流中保存。
        MM.Write(PWideChar(WS)^, Length(WS) * Sizeof(WideChar));
        MM.SaveToFile('test2.txt');    FreeMem(P);
      finally
        SL.Free;
        MM.Free;
      end;
    end;我先在一个笔记本中写下:“yes是的,这是Unicode”,然后保存为Test文件。这个时候它是Ansi编码。
    执行我上面的代码之后,文本保存为Test2,这时它就是Unicode码了,可以正确显示,你可选另存为看看它是不是Unicode编码。