UNICODE是一种大字符集编码,但是我最近遇到一个问题。UNICODE字符集和ASCII集编码重叠的部分是一致的,但是我发现在DELPHI中,码值在 $F0~$FF之间的UNICODE字符无法正常显示,请问这个问题怎么解决?

解决方案 »

  1.   

    什么类都不使用啊。最近研究通过PC向手机发短信的程序,发现有些字符在PC和手机中显示的不一样。查找相应的规范发送这些字符的UNICODE码值在 $00F0~$00FF 之间(主要是西欧的符号,就是在手机上用英文输入法时看到的那些稀奇古怪的像拼音一样的东西)。把规范中的示例文本复制到记事本中,保存的时候提示文本中包含 UNICODE 编码,建议使用UNICODE格式保存(我的系统是WINXP)。如果保存为UNICODE格式再打开时可以显示出来,如果保存成ANSI格式,再打开时这些符号就全部变成了问号。
      

  2.   

    呵呵...没明白楼主说的,,好象同DELPHI没有关系..
      

  3.   

    同DELPHI关系不是很大,主要是属于代码页的问题吧。但是现在我是用DELPHI写程序啊。把下面六个字节写能一个文本文件,用WINXP或者WIN2000的记事本打开后可能看到一个大写的和一个小写的字母“E”,都有声调似的。请问这样的字符在DELPHI中怎么显示出来?显示在TLABEL或者TEDIT中都可以,求助了。$: FF FE C9 00 E8 00这些字符用普通的文本操作在DELPHI中无法显示,怎么办?
      

  4.   

    不是。WIN2K和WINXP的记事本认为一个以 $FFFE 开头的文本文件是UNICODE编码文件。UNICODE编码每个字符是两个字符,我写的文本是两个字符,如果象楼上的那样,就只有一个字符了。比如"$ FF FE 5A 5A"的内容是一个汉字“婚”,而"$ FF FE 5A 00 5A 00"的内容则是两个大写的字母“Z”。
      

  5.   

    UNICODE与ANSI编码的混用一直是个头疼的问题。。
    我也只有这样做。。var
      s:widestring;
      n:Integer;
      fo:TFileStream;begin
      SetLength(s,1000);
      fo:=TFileStream.Create('a.txt',fmOpenRead);  fo.Read(pointer(s)^,2);//忽略掉前头的两字节。。
      n:=fo.Read(pointer(s)^,1000);
      fo.Free;
      SetLength(s,n div 2);
      TextOutW(Canvas.Handle,50,50,pwidechar(s),length(s));
      

  6.   

    呵呵。或者在显示之前把WIDESTRING转成Ansi的
    不过有个别字符显示有点变化。。
      

  7.   

    转换成ANSI字符正常情况下当然没有问题,可是我说的这种情况就不行了。因为两个UNICODE编码转换后就变成了一个ANSI字符,这不是我的本意。使用TEXTOUTW是个好主意,谢谢你。我还想问一下,有没有办法能让一个TLABEL或者TMEMO控件能够显示UNICODE字符呢?
      

  8.   

    除了改写或重写TLABEL源码..我没有想去其它办法.在网上看到有UNICODE编码的VCL组件..我没有用过,你可以试试.
    http://tnt.ccci.org/delphi_unicode_controls/