فارسی نویسی در Qt(540 مجموع کلمات موجود در متن) (8409 بار مطالعه شده است)
برای
فارسینویسی بهترین گزینه استفاده از
کارکترست 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
|