我看了一些文章说WINDOWS NT及以上版本是基于UNICODE内核的,而我的系统繁体版的WINDOWS的目录确实也能同时显示简体和繁体。但当我用繁体版的WINDOWS的API:FINDFIRSTFILEW、FINDNEXTFILEW来读取简体的目录时,返回的字符串可以通过TNTUNICODE控件正确显示,但一写入数据库就变乱码,数据库的相关字段已经设置为NVARCHAR。各位朋友请指点迷津,非常感谢。

解决方案 »

  1.   

    我的c:\简体目录分别包含2个简体文件名的文件:简体文件1.txt和简体文件2.txt。查找简体目录并用TNTUNICODE控件显示的代码:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      WS, AMsg: WideString;
      AFH: THandle;
      ADataW: _Win32_Find_DataW;
    begin
      WS := 'c:\简体目录';
      AFH := FindFirstFileW(PWideChar(WS + '\*.*'), ADataW);
      if AFH <> INVALID_HANDLE_VALUE then begin
        repeat
          AMsg := ADataW.cFileName;
          WideShowMessage(AMsg);//显示正常
          ShowMessage(AMsg);//显示乱码
        until not FindNextFileW(AFH, ADataW);
      end;
    end;
      

  2.   

    >>但一写入数据库就变乱码
    估计是显示的问题而已就如 WideShowMessage(AMsg);//显示正常
          ShowMessage(AMsg);//显示乱码
    只是 showMessage 不能正确显示,而不是 Amsg 里面的数据乱了
      

  3.   

    不是的,写进数据库后,我用查询分析器查到的是乱码,用DELPHI读数据库的相关字段,再用TNTUNICODE控件显示,也变乱码了。
    写入数据库时用
    //AMsg从上文已经知道是个WideString
    AODQuery1.FieldByName('AMsg').Value    := AMsg;//乱码
    AODQuery1.FieldByName('AMsg').AsString := AMsg;//乱码
    TTntWideStringField(AODQuery1.FieldByName('AMsg')).AsWideString := AMsg;//乱码
    搞得我现在比较郁闷。
      

  4.   

    另外我用断点追踪读取目录时的文件名,发现这个时候看到的已经是乱码,不过把这堆乱码给TNTUNICODE控件显示,居然能显示出来。但写入数据库就一定是乱码,把写入数据库后的数据再读出来,TNTUNICODE控件就显示不了。
      

  5.   

    你换字段类型试试呀.比如 char
      

  6.   

    换过了,VARCHAR或者NVARCHAR字段,都是乱码
      

  7.   

    问题极有可能出现在读写数据库上。写数据库时不要用这样的语句:
    AODQuery1.FieldByName('AMsg').Value := AMsg;//乱码
    AODQuery1.FieldByName('AMsg').AsString := AMsg;//乱码用SQL和Params,比如下面
    ADOQuery1.sql.text := 'insert into yourTable(AMsg) values(:Msg)';
    with Qry.Parameters.ParamByName('Msg') do
    begin
      DataType := ftWideString;
      Value := AMsg;
    end;
    ADOQurey1.ExecSQL;从数据库读出来时这样:
    WideShowMessage(VarToWideStr(AODQuery1.FieldByName('AMsg').Value));试试看。
      

  8.   

    比如Oracle数据库
    写数据库时与Oracle字符集有关的。
      

  9.   

    var AMsg: widestring;AODQuery1.FieldByName('AMsg').AsWideString:= AMsg;这样呢?估计你用string 去存,被转错了
      

  10.   

    ado 连接串里面的 “自动转换” 设置为false 看看
      

  11.   

    问题极有可能出现在读写数据库上。......
    ==============================================
    按您说的代码测试了一下,还是不行。
    var AMsg: widestring;AODQuery1.FieldByName('AMsg').AsWideString:= AMsg;这样呢?估计你用string 去存,被转错了
    ==============================================
    您说的很有道理,但我用这个语句转
    TTntWideStringField(AODQuery1.FieldByName('AMsg')).AsWideString := AMsg;//乱码
    真的很奇怪啊。
    ado 连接串里面的 “自动转换” 设置为false 看看
    ==============================================
    请问是哪个属性呢,怎么设?
      

  12.   

    还是不知道是啥问题,算了,都转成Big5了事。
    谢谢大家。