PDA

View Full Version : تفاوت wstring با string



karimi72
شنبه 30 آذر 1392, 15:03 عصر
دوستان فرق string با wstring و بقیه توابعی وکلاس هایی که مثل string یک w در ابتدای آنها قرار دارد در چیست؟

کامبیز اسدزاده
شنبه 30 آذر 1392, 19:07 عصر
دوستان فرق string با wstring و بقیه توابعی وکلاس هایی که مثل string یک w در ابتدای آنها قرار دارد در چیست؟

کاربرد string با رشته‌های اسکی هست و کاربرد wstring با رشته‌های یونیکد.

روش استفاده :


typedef std::basic_string<char> string;
typedef std::basic_string<wchar_t> wstring;

karimi72
دوشنبه 02 دی 1392, 07:52 صبح
پس با استفاده از wstring فارسی پستیبانی می شه ؟

Ananas
دوشنبه 02 دی 1392, 12:45 عصر
سایز کاراکترهاشون فرق داره. دستوراتی که w دارن (Wide) فرض میکنن کاراکتر شما دو بایت هست ولی اونهایی که با A دارن (Ansi) سایز کاراکترهاشون 1 بایت هست.

karimi72
دوشنبه 02 دی 1392, 19:43 عصر
اگر میشه یک مثالی درباره ی کاربرد این نوع داده ای بزنید اصلا چه دلیلی برای حضورش هست ؟

Ananas
سه شنبه 03 دی 1392, 01:14 صبح
مثالش استفاده از حروف فارسیه. با یک بایت حافظه فقط 256 کاراکتر میشه داشته باشیم (دو به توان 8) ولی با دو بایت حافظه 65536 تا کاراکتر متفاوت میتونیم داشته باشیم(2 به توان 16). چون دامنه ی بیشتری داره میتونه کاراکتر های چند زبان ختلف دنیا رو پشتیبانی کنه. مثالش هم میتونه این باشه:

#include <iostream.h>
#include <windows.h>
using namespace std;
int main()
{
wstring w_str = L"Wide char str : متن فاسی";
string a_str = "Ansi char str : متن فارسی"; // ؟؟؟؟؟؟؟؟؟
//-------------------------------------
MessageBoxA(0, a_str.c_str(), "", 0);
MessageBoxW(0, w_str.c_str(), L"", 0);
//-------------------------------------
MessageBoxA(0, (char *)w_str.c_str(), "", 0); // errorrrrrrrrrrrr
MessageBoxW(0, (wchar_t*)a_str.c_str(), L"", 0); // errorrrrrrrrrrrr

getchar();
return 0;
}

دو تا پیغام اول متن ها رو درست نمایش میدن ولی قسمت انگلیسیشون رو ولی قسمت فاسی رو فقط wstring درست ذخیره کرده. اما دو تا پیغام بعدی متن ها رو یکی اشتباه و دیگری ناقص (فقط کاراکتر اول) رو نمایش میدن. دلیلش اینه که آخر رشته باید به 0 ختم بشه و بایت اول رو یک کاراکتر فرض میکنه و وقتی به بایت دوم میرسه که صفره، اونجا رو آخر رشته میشناسه در حالی که اون جزو کاراکتر اوله نه کاراکتر دوم.
برای شناسوندن رشته های w در متن برنامه به کامپایلر، ابتدای رشته قبل از "" از L استفاده میشه.