Delphi代码翻译成BCB
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(S));
Memo2.Text := W;
finally
Free;
end;
问题点数:50、回复次数:10Top
1 楼constantine(飘遥的安吉儿)回复于 2005-12-20 12:45:56 得分 20
String S;
WideString W;
TMemoryStream *ms;
if(!FileExists("c:\\temp\\temp.txt")) return;
ms=new TMemoryStream();
try
{
ms->LoadFromFile("c:\\temp\\temp.txt");
if( ms->Size < 4 ) return;
S.SetLength(2);
ms->Read(S.c_str(),S.Length());
if((S.SubString(1,2))!=String(0xFF)+String(0xFE)) return;
W.SetLength((ms->Size - 2) / sizeof(WideChar));
ms->Read(W.c_bstr(), S.Length());
Memo2->Text = W;
}
__finally
{
delete ms;
}
//#$FF#$FE 这个东西是什么,不知道我表达的对不对Top
2 楼aniven(Compile Failed)回复于 2005-12-20 13:20:25 得分 0
我也是不明白这个,这个代码是加载Unicode文本到Memo中,编译是通过了,但是结果是乱码!Top
3 楼CityHost(市长)回复于 2005-12-20 14:36:05 得分 10
如果这样的话,那我以后要直接把D的编译成DCU,看看行不行Top
4 楼aniven(Compile Failed)回复于 2005-12-20 14:36:47 得分 0
应该是 char S[]={0xFF,0xFE};Top
5 楼ccrun(老妖)(www.ccrun.com)回复于 2005-12-20 14:39:29 得分 5
一样的。简单点说就是组成一个字符串,前一个字节是0xFF,后一个字节是0xFE,是Unicode编码的标志。Top
6 楼constantine(飘遥的安吉儿)回复于 2005-12-20 15:36:20 得分 5
你试过delphi的代码没有?Top
7 楼PPower(月亮光光,照地堂)回复于 2005-12-20 16:32:42 得分 5
if Copy(S, 1, 2) <> #$FF#$FE then exit ;
//$FF 即 255 #$FF 即#255 ; $前置符為16進制數字標志,#是字符轉義符
可翻譯為:
if(S[1] != 0xFF || S[2] != 0xFE) return ;
翻譯成: String(0xFF)+String(0xFE) //這是錯誤的。這句的結果是:255254
如果要翻譯成字符串可這樣: "\0xff\0xfe"
Top
8 楼xili()回复于 2005-12-20 19:13:20 得分 5
用 memo 显示 unicode 肯定乱码, 用TnT吧.
这段 delphi的代码很有意思, 转了个很大的弯.
它其实是想说 if( W[0] != 0xfeff ) exit
我不太了解 delphi, 难道没有 wchar_t 类型?
0xfeff 是 unicode 保存文本的 约定. 应该是对应 utf16吧.
Top
9 楼xili()回复于 2005-12-20 19:16:54 得分 0
哦, 可能是因为 TMemoryStream 是单字节类型,所以绕弯了.Top
10 楼aniven(Compile Failed)回复于 2005-12-22 15:04:00 得分 0
已经成了,用的是char S[]={0xFF,0xFE};
"\0xff\0xfe"不知道行不行Top




