سلام
من دیشب این پست رو تو تکنوتاکس زدم ولی ظاهرا اونجا نتونم به جوابم برسم، امیدوارم اینجا کسی بتونه کمک کنه...
سه سوال عجیب دارم. من آخرش کم کم دارم گیج میشم.
اول اینکه کد زیر رو ببینید:
#include <fstream>
int main()
{
wofstream of("filename");
of << L"سلام" << endl;
return 0;
}
چرا کد بالا کار نمیکنه؟ چرا محتویات filename خالیه و چرا کد زیر کار میکنه!؟
#include <fstream>
int main()
{
ofstream of("filename");
of << "سلام" << endl;
return 0;
}
و سوال بعد اینکه ظاهرا در c++ نوع char فقط ۱ بایت اشغال میکنه تا اینجا مشکلی نیست ولی وقتی که یک رشتهای از کارکترها رو میخوای ذخیره کنی برای هر کاراکتر ۴ بایت حافظه اشغال میشه! مثلا
const char ch = 'a';
const char* hello = "سلام";
cout << sizeof(ch) << "-" << sizeof(hello) << endl;
و تا جایی هم که فهمیدم هر کاراکتر از رشتههای utf8 در ۴ بایت ذخیره میشه (یعنی هر ۴ بایت یک کاراکتر از نوع utf8 رو نشکیل میده). اگه میشه توضیح بدین که عملگر sizeof چطور اندازه رو ۴ بایت تشخیص میده برای رشتهها!؟
(هر نوع char دارای ۱ بایت هست و کاراکتر یونیکد به چهارتا نوع char احتیاج داره، تا اینجا درست ولی چرا sizeof عدد ۴ رو میده، مگه وقتی که یک اشارهگر رو به sizeof میدیم نباید حافظه اندازه خانه اول رو برگردونه؟)
و سوم اینکه من چطور میتونم با دادن رقم یونیکد (unicode) یک کاراکتر، خود کاراکتر رو در یک متغیر ذخیره کنم؟ مثلا حرف 'ث' کد یونیکدش بصورت U+062B است، من چطور میتونم این کد رو در برنامه به یک متغیر بدم و بعد بجای کد، خود حرف 'ث' رو تحویل بگیرم. دقت کنید که نمیخوام از کاراکترهای کنترلی (مثلا "u062B\") استفاده کنم و میخوام که عدد داخل یک متغیر از نوع عدد رو بگیرم و اون عدد رو بعنوان کد یونیکد تبدیلش کنم به کاراکتر (یا رشته) تا کاراکتر یونیکدش نمایش داده بشه. یعنی مثلا یک متغیر i از نوع عددی داشته باشیم که مقدارش در مبنای ۱۶ برابر 62B باشه و بخوایم این عدد رو به یک کارکتر (یا رشته) تبدیل کنیم که محتوای آن کاراکتر معادل کد یونیکد 62B باشه.
باور کنید همه جا رو گشتم، کلافه شدم چون خبری نیست!
من چشم در راهم به امید اینکه کسی حوصله کنه و یک جواب هر چند کوتاه هم بسیار زیباست.