PDA

View Full Version : مشکل در تبدیل String به AnsiString



khazaie01
دوشنبه 03 خرداد 1389, 08:52 صبح
سلام دوستان
این کد را ببینید ، در دلفی 7 مشکلی نداره اما در دلفی 2010 خروجی عجیبی داره !!


var
ma:AnsiString;
begin
ma:=chr(192);
ShowMessage(IntToStr ( ord(ma[1]) ) );
end;
این هم متنی که نمایش داده می شود بعد از اجرای قطعه کد بالا :



65
چرا اینجوری میشه ؟!
در برنامه یک متغیر string دارم که در آن کاراکتری با کد اسکی 192 است و به ناچار باید آن را به AnsiSring تبدیل کنم که بعد از تبدیل ، کد اسکی 192 به 65 تغییر می کند !
ممنوووووووووووووون

Felony
دوشنبه 03 خرداد 1389, 09:14 صبح
در دلفی 2010 و دلفی 7 نسخه Lite مشکلی نداره ، میگم این دلفی 7 نسخه Lite مگه یونیکد هست ؟

khazaie01
دوشنبه 03 خرداد 1389, 09:18 صبح
ممنووووون دوست عزیز
من با دلفی 7 تست کردم مشکلی نداره ، اما تو دلفی 2010 اینجوری میشه !
شما با 2010 تست کردید ؟! خروجی 192 بود ؟!!

Felony
دوشنبه 03 خرداد 1389, 09:23 صبح
بله تو دلفی 2010 تست کردم هر دو خروجی هم 192 بود ، تو چه سیستم عاملی تست کردید ؟
تنضیمات زبان سیستم عامل درست بود ؟

khazaie01
دوشنبه 03 خرداد 1389, 09:25 صبح
نباید به سیستم عامل ربطی داشته باشه چون با دلفی 7 مقدار 192 و با دلفی 2010 مقدار 65 را بر میگردونه !
ویندوز Seven نصب دارم ، ویندوز و دلفی 2010 را از فروشگاه همین سایت گرفتم.
این نسخه دلفی :
Embarcadero® Delphi® 2010 Version 14.0.3593.25826

Felony
دوشنبه 03 خرداد 1389, 09:29 صبح
:متفکر:من هم میدونم نباید ب سیستم عامل ربطی داشته باشه ، ولی وقتی تو یک نسخه مقادیر متفاوتی برگشت داده میشه آدم همچین فکرهایی هم میکنه ...

این هم ورژن دلفی من : Embarcadero® Delphi® 2010 Version 14.0.3513.24210

khazaie01
دوشنبه 03 خرداد 1389, 09:33 صبح
دلفی من جدیدتره :لبخند:
دوستان دیگه هم لطفا این قطعه کد را تست کنند و اگر خروجی 192 را دریافت کردند ، نسخه دلفی را اینجا قرار بدن !! کارم حسابی گیره ، اگه درست نشه مجبورم از دلفی 7 برای پروژه استفاده کنم
بازم ممنوووووووووون

مهران رسا
دوشنبه 03 خرداد 1389, 09:43 صبح
وقتی ma از نوع AnsiString هست عدد 65 برگشت داده میشه . وقتی به نوع String تغییرش میدم عدد 192 برگشت داده میشه .

به ناچار باید آن را به AnsiSring تبدیل کنم که بعد از تبدیل ، کد اسکی 192 به 65 تغییر می کند
کد های اسکی استاندارد از 0 تا 126 هستند .

http://en.wikipedia.org/wiki/ASCII

khazaie01
دوشنبه 03 خرداد 1389, 09:55 صبح
کد های اسکی استاندارد از 0 تا 126 هستند .

http://en.wikipedia.org/wiki/ASCII
ممنووووووون دوست عزیز
بله ...
ببینید یک رشته دارم به این شکل C0010000000000010003 که باید به پورت سریال و برای سنسور اثر انگشت ارسال کنم ، اما این کد مبنای 16 است و باید آن را به رشته ای از کاراکترها تبدیل کنم ، برای این کار 2 تا 2تا جدا می کنم و به مبنای 10 تبدیل می کنم سپس عدد بدست آمده را به کاراکتر تبدیل می کنم (با دستور chr) ، و این کاراکتر ها را در کنار هم در یک متغیر استرینگ قرار می دهم ، ولی مجبورم رشته را به AnsiString تبدیل کنم که بعد از تبدیل کاراکتری که کد 192 داشته به کاراکتری با کد 65 تبدیل میشه و در نتیجه اطلاعات به درستی ارسال نمیشه ...

khazaie01
دوشنبه 03 خرداد 1389, 13:15 عصر
وقتی ma از نوع AnsiString هست عدد 65 برگشت داده میشه . وقتی به نوع String تغییرش میدم عدد 192 برگشت داده میشه .


دوست عزیز مشکل من اینه که حتما باید AnsiString باشه .
میشه بگید چه نسخه ای از دلفی را نصب دارید ؟ پس تا اینجا فقط سیستم آقای مجتبی تاجیک (http://barnamenevis.org/forum/member.php?u=63881) عدد 192 را برگشت داده !!
این موضوع هیچ دلیل علمی نداره ؟!!

مهران رسا
دوشنبه 03 خرداد 1389, 13:34 عصر
دوست عزیز مشکل من اینه که حتما باید AnsiString باشه .
میشه بگید چه نسخه ای از دلفی را نصب دارید ؟ پس تا اینجا فقط سیستم آقای مجتبی تاجیک (http://barnamenevis.org/forum/member.php?u=63881) عدد 192 را برگشت داده !!

منم دلفی 2010 . نسخه 14.0.3513.24210 استفاده میکنم .

این موضوع هیچ دلیل علمی نداره ؟!!
نمیدونم .

khazaie01
دوشنبه 03 خرداد 1389, 13:39 عصر
این هم ورژن دلفی من : Embarcadero® Delphi® 2010 Version 14.0.3513.24210


منم دلفی 2010 . نسخه 14.0.3513.24210 استفاده میکنم .



یکم عجیب به نظر میاد !!! نسخه دلفی شما با نسخه دلفی آقای مجتبی تاجیک (http://barnamenevis.org/forum/member.php?u=63881) یکی هست اما خروجی هایی که گرفتید متفاوت !!
کس دیگه ای هم هست که با اجرای برنامه در دلفی 2010 ، عدد 192 را به عنوان خروجی دریافت کرده باشه ؟!

vcldeveloper
دوشنبه 03 خرداد 1389, 14:07 عصر
چرا اینجوری میشه ؟!برای اینکه Chr در دلفی 2009 و 2010 ورودی را به عنوان یک کد یونیکد فرض میکنه. مقدار 192 میشه À که یک کارکتر غیر ASCII هست. متغیر شما ANSI هست، و این مقدار تبدیل میشه به A. وقتی A رو به Ord میدید، مقدار 65 را دریافت می کنید که مربوط به کارکتر A هست، و درست هم هست. اگر متغیر شما یونیکد باشه، تابع Chr مقدار À را به درستی در آن درج میکنه، و Ord هم به درستی مقدار 192 رو برمیگردونه.

اگر متغیر شما ANSI هست، و کد شما هم یک کد ASCII هست، می تونید از AnsiChar برای Type-Cast استفاده کنید:


Ma : AnsiString;
...
Ma := AnsiChar(192);

که با توجه به Code Page فعال روی سیستم شما، مقدارش متفاوت هست. اگر Code Page فارسی روی سیستم تون فعال باشه، مقدار Ma میشه کارکتر ه فارسی.

khazaie01
دوشنبه 03 خرداد 1389, 19:58 عصر
خیلی خیلی خیلی ممنوووووووووون آقای کشاورز
به جای Chr از AnsiChar استفاده کردم و تمامی متغیر های رشته ای را به AnsiString تبدیل کردم و بعد رشته را به دستگاه ارسال کردم و بدون هیچ مشکلی کار کرد .
باز هم ممنوووووووووون