关于MEMO读取的问题(UNICODE编码) ( 积分: 100 )

  • 主题发起人 主题发起人 jacknes111
  • 开始时间 开始时间
希伯来文哦,,Unicode编码来的,,
 
问题还在讨论吧.
我在往数据库里记录韩文呢.
 
jacknes111,
今天又测试了一下,发现adoQuery在从access备注型字段读取数据存入ado时,将其转成了单字节,直接导致在界面中显示问号,这个我没有找到办法,可能要修改delphi本身代码,或者找到TntAdoQuery试试。
但将备注型该成文本型是可以正常显示的,在ado中的字段类型为ftWideString。
如果允许,你可以用sqlserver数据库等,将备注型改用nVarchar,再配合Tnt,经测试是可以正常显示你的希伯莱文.
nVarchar的长度是4000个WideChar。
 
那有没有TntAdoQuery控件啊,,我的TNT控件包没有哦,,
 
如果你改用sqlserver数据库等,将备注型改用nVarchar,
就不需要TntAdoQuery,Ado就可。
 
你有TntAdoQuery?因为我的数据都是Access的哦,,转换起来麻烦哦,,
 
我用的是InterBase呢.一直都不成功.
 
InterBase我没有用过哦,,你没有用其他的数据库比如Access或SQL去试试嘛?看看会不会出现你的那种情况哦,,
 
http://bbs.2ccc.com/topic.asp?topicid=258095
我写的程序和数据见21楼附件
谁可以帮帮我哦,
 
你是我群里面的寻梦吧?
 
是啊。。
 
Access也支持Unicode编码的,用大家的说的方法没有错,我曾经作过一个双语系统.
 
例如Unicode字串"abhor(פ') לתעב"
以上串长度14,28个字节。
如果Access中"jiexi"字段是备注型,则Ado中是ftMemo类型,ftMemo是继承自ftBlob
AdoQuery1.FieldByName('JieXi').asVariant;
//这个Variant,Delphi会把它处理成string,它的长度是14,你会得到问号
如果这样取值
var
ms : TStream;
begin
ms := AdoQuery1.CreateBlobStream(AdoQuery1.FieldByName('JieXi'));
ShowMessage(IntToStr(ms.Size));
//这里你会看到它的长度还是14,而且我查看过它的十六进制码,
发现应该是28个字节的串,只正确截了后面14个,前面14个乱了。
显示的结果是前七个字符是乱码,不是问号,后七个字符是正确的。
end;
*****************
但是如果"JieXi"字段在Access中用"Ole 对象"类型,则
procedure TTntForm1.TntButton2Click(Sender: TObject);
var
MyVariant : widestring;
ms : TStream;
iSize : int64;
begin
TntRichEdit1.Clear;
ms := AdoQuery1.CreateBlobStream(adoQuery1.FieldByName('Jiexi'),bmRead);
try
iSize := ms.Size;
SetLength(MyVariant,iSize div 2);
ms.Read(MyVariant[1],iSize);
TntRichEdit1.Text := MyVariant;
finally
ms.Free;
end;
end;
以上这段代码,可以正确显示你的希伯莱文。即你可以将备注型改成Ole对象型。
////////////////
还有Access数据库转到SqlServer只很容易的,只要在SqlServer中新建一个数据库,在利用
"导入数据"功能就可以了。
 
多人接受答案了。
 
后退
顶部