ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:1
مجموع:مجموع:1
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

فارسی نویسی در Qt

(540 مجموع کلمات موجود در متن)
(8054 بار مطالعه شده است)  نسخه چاپی

برای فارسی‌نویسی بهترین گزینه استفاده از کارکترست utf-8 می‌باشد. نیاز به کمی تغییر دارید تا برنامه به شما فونت‌های زیباترینمایش بدهند. برای رفع این مشکل شما باید از کلاس QTextCodec و QByteArray استفاده کنید.در واقع شما یک حافظه برای رشته خود در نظر می‌گیرید و آن را به هر Encodingی تبدیل می‌کنید.

نکته: توجه داشته باشید که QString از UTF-16 استفاده می‌کند نه UTF-8! برای فهم بهتر لطفا به برنامه زیر دقت کنید

1#include <QtGui>

2#include <QtCore>

3#include <QLabel>

4int main(int argc،char *argv[])

5{

6QString encodingstr(QByteArray string);

7 QApplication *my=new QApplication(argc،argv);

8 QMainWindow x;

9 QLabel *ee=new QLabel(encodingstr("سلام !")،0);

10 x.setCentralWidget(ee);

11 x.show();

12 return my->exec();

13}//end of main program

14QString encodingstr(QByteArray string)

15{

16 QByteArray encodedString = string;

17 QTextCodec *codec = QTextCodec::codecForName("UTF-8");

18 return codec->toUnicode(encodedString);

19}



بیایید برنامه را بررسی کنیم. اگر می‌خواستید به جای تابع encodingstr که خودمان نوشتیم، یک رشته را برای کلاس QLabel می‌نوشتید، در خروجی به مشکلاتی در نمایش قلم‌ها برمی‌خوردید. ولی تابع مذکور یک رشته را دریافت و آن را از نوع QString و یونی‌کد شده به شما تحویل می‌دهد.


درباره‌ی تابع :

یک شی از QByteArray که چند بایت برای شما فراهم می‌کند را تعریف می‌کنیم به نام encodedString که محتویات این حافظه رشته ما می‌باشد. سپس یک شی دیگر از نوع QTextCodec تعریف کرده و به آن میگوییم که رشته را به چه فرمتی تبدیل کنیم. شما می‌توانید یک لیست معتبر از coding‌ها را اینجا ببینید:

Big5, Big5-HKSCS, EUC-JP, EUC-KR, GB18030-0, IBM 850, IBM 866, IBM 874, ISO 2022-JP, ISO 8859-1 to 10, ISO 8859-13 to 16, Iscii-Bng، Dev، Gjr، Knd، Mlm، Ori، Pnj، Tlg، and Tml, JIS X 0201, JIS X 0208, KOI8-R, KOI8-U, MuleLao-1, ROMAN8, Shift-JIS, TIS-620, TSCII, UTF-8, UTF-16, UTF-16BE, UTF-16LE, Windows-1250 to 1258,WINSAMI2

که این coding ها به صورت پارامتر به تابع QTextCodec::codecForName پاس می‌شوند، آنگاه رشته مربوطه را به تابع toUnicode ارسال می‌کنیم که همان رشته را برای تابع برمی‌گردانیم. (البته با encodingی که می‌خواهیم باز می‌گردد)


نکته :

تابع مذکور دارای crash می‌باشد.زیرا اندازه رشته نا مشخص است.،و اگر رشته از طول QByteArray بیشتر شود تابع crash می‌کند.برای رفع آن می‌توانید ازهمان تابع toUnicode با فرمت زیر استفاده نمایید:

QString QTextCodec::toUnicode ( const char * input، int size، ConverterState * state = 0 ) const


نکته برای مهندسین نرم‌افزار:

همیشه در برنامه نویسی چند زبانه زمانی که می‌خواهید از رشته در جایی استفاده کنید نیاز به تصمیم گیری دارید که از چه زبانی استفاده شود و رشته‌ها از کجا خوانده شوند، در Qt تابعی به نام tr وجود دارد که QString برمی‌گرداند ولی همان مشکل مذکور utf8 را دارا می‌باشد. اما تابعی دیگر با نام trUtf8 نیز وجود دارد که با coding یونی‌کد UTF-8 کار می‌کند. هر دوی این توابع عضو کلاس QObject می‌باشند. زمانی که از تابع trUtf8 استفاده کنید، دیگر نیازی به تابعی که نوشتیم نخواهید داشت.

برای این تابع را نوشتیم که با conversation و انواع encoding آشنا شوید و اگر نه تابعی مثل trUtf8 وجود دارد.


GTK و Qt

GTK از تمرکزگرایی در استفاده از یونی‌کد بهره می‌گیرد در صورتی که Qt اینگونه نمی‌باشد و ممکن است در کلاس و یا تابعی خاص به گونه‌ای دیگر با encoding ها رفتار می‌شود. در حقیقت شما کلاسی مثل QString را می‌بینید که فقط UTF تولید می‌کند ولی در عوض برای چاپ آن در کلاس QLabel نمی‌توانید آن را پیش‌فرض UTF به صفحه نمایش بکشید. این یعنی عدم تمرکز در استفاده از encoding های موجود!


نکته نهایی

دو تابع toLower و toUpper در مورد فارسی کار نمی‌کند.اینگونه موارد مربوط به پراکندگی Qt در استفاده از یونی‌کد می‌باشد.که مواردی از این نوع نیز کم نمی‌باشند.



نویسنده: محسن پهلوان‌زاده

PDF Version

تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.