PDA

View Full Version : سوال: مشکل با فارسی نویسی



saeedIRHA
چهارشنبه 01 آذر 1391, 23:43 عصر
سلام دوستان،

من هرچی‌ سعی‌ کردم متاسفانه نمیتونم در برنامم از متن فارسی استفاده کنم
کاراکتر‌های که در کد برنامه hardcode می‌کنم به صورت علامت سوال ؟ نمایش داده می‌شند در صورتی‌ که Interface برنامه که در Designer طراحی کردم با فارسی مشکلی‌ نداره
مثلا نمونهٔ کد زیر:


QString msg = QString::fromUtf8("س");
qDebug() << msg;
qDebug() << msg.length();
QMessageBox::warning(this ,QString::fromUtf8("سعید") , msg);
ui->txtAddress->setText(tr("سعید"));

مشخصات سیستم من هم به این شرح هست:
Windows 7
IDE: Qt Creator 2.6
Qt 4.8.3
Compiler : Visual Studio 2010

نا گفته نماند که Save کردن Encoding فایل رو به UTF-۸ تغییر دادم ولی‌ باز هم مشکل دارم ، جالب اینجاست که
در لینوکس بدون هیچ اشکالی‌ کامپایل می‌شه ، اما در ویندوز با این مشکل بر خوردم

لطفا راهنمای کنید ،
با تشکر

rubiks.kde
پنج شنبه 02 آذر 1391, 01:49 صبح
سلام دوست عزیز برای حل این مشکل باید تنظیمات خود Qt Creator رو هم برای editor روی utf-8 تنظیم کنی.
برای این کار هم روی تولبار سمت چپ(بعد از باز کردن پروژه) روی project کلیک کنید و editor setting رو انتخاب و utf-8 رو انتخاب کنید با این کار وقتی همان پروژه رو ببندید و دوباره باز کنید تمام متنهای فارسی نوشه شده به ? تبدیل میشوند که نگران نباشید دوباره تمام اون ها رو بنویسید همون طور که توی مثال بالا گفتید ولی این بار که اجرا کنید می بینید که درست شده و دیگه اون مشکل رو نداره

saeedIRHA
پنج شنبه 02 آذر 1391, 08:38 صبح
با سلام،

همونطور که در پست قبل هم گفتم من این کارو انجام دادم ، و فایل‌ها بصورت unicode سیو میشن
و متن فارسی در فایل نمایش داده می‌شه ، اما بعد از کامپایل و اجرای برنامه این مشکل به وجود میاد
و متن فارسی به صورت علامت سوال "؟" نشون داده می‌شه

این مشکل در لینوکس وجود نداره(امتحان کردم و همه‌چیز درست بود)‌اما در ویندوز این مشکل هست
لازم به ذکر هست که دوباره تاکید کنم کامپایلرِ من Visual Studio ۲۰۱۰ هست

alamate_aoal
جمعه 03 آذر 1391, 01:45 صبح
سلام

کیوت کریتور بصورت پیش فرض از انکدینگ سیستم برای ذخیره فایل سورس استفاده میکنه, دستور زیر رو تست کن ببین کار میکنه یا نه

QTextCodec::setCodecForTr(QTextCodec::codecForName ("UTF-8"));
QMessageBox::information(this, " ", tr("سلام") );


دیزاینر بجای خود کاراکتر از کدش استفاده میکنه مثلا دستور بالا رو به اینصورت مینویسه
QMessageBox::information(this, " ", trUtf8("\330\263\331\204\330\247\331\205") );


بعید می دونم این قضیه ربطی به کامپایلر داشته باشه(حدسم اینه که به ویندوزت مرتبطه) در هر صورت افزونه کیوت برای VS رو نصب کن ببین اونجا هم این مشکل وجود داره یا نه
در کل بهتره برای رشته های قابل رویت توسط کاربر از کاراکترهای اسکی در سورس کدتون استفاده کنید و برای غیر اسکی فایل ترجمه مهیا کنید

saeedIRHA
جمعه 03 آذر 1391, 15:22 عصر
سلام

کیوت کریتور بصورت پیش فرض از انکدینگ سیستم برای ذخیره فایل سورس استفاده میکنه, دستور زیر رو تست کن ببین کار میکنه یا نه

QTextCodec::setCodecForTr(QTextCodec::codecForName ("UTF-8"));
QMessageBox::information(this, " ", tr("سلام") );


دیزاینر بجای خود کاراکتر از کدش استفاده میکنه مثلا دستور بالا رو به اینصورت مینویسه
QMessageBox::information(this, " ", trUtf8("\330\263\331\204\330\247\331\205") );


بعید می دونم این قضیه ربطی به کامپایلر داشته باشه(حدسم اینه که به ویندوزت مرتبطه) در هر صورت افزونه کیوت برای VS رو نصب کن ببین اونجا هم این مشکل وجود داره یا نه
در کل بهتره برای رشته های قابل رویت توسط کاربر از کاراکترهای اسکی در سورس کدتون استفاده کنید و برای غیر اسکی فایل ترجمه مهیا کنید

سلام دوست عزیز ، حق با شما هست در مورد اینکدینگ Qt Creator, اما من اینکدینگش رو به UTF-۸ تغییر دادم و وقتی‌
فایل رو با editor‌های دیگه باز می‌کنم کارکترهای unicode نمایش داده میشن
و کدی هم که شما دادین متأسفانه همچنان کار نمی‌کنه و کاراکتر‌ها با ؟ نمایش داده میشن
و تا اونجا که من دیدم Qt Creator تنها وقتی‌ کد octal کاراکتر هارو بجای کارکترهای UTF-۸ میذاره که شما اون کد رو در
desinger نوشته باشین نه در سورس کد(هنگام طراحی GUI)
منظورتون چیه که فک می‌کنید مشکل از Windows من باشه؟ لطفا بگید چی‌ تو ذهنتون هست که من چک کنم فقط زبونه
پیشفرض ویندوز من English هست اما میدونم که برنامه‌های با زبونه فارسی رو هم اجرا می‌کنه(چون قبلان تست کردم)
یکی‌ از warrning‌های که مثلا زمان کامپایل Qt Creator میده در رابطه با کارکترهای unicode استفاده شده در سورس کد به شرح زید هست:


X:\Programming\Qt\SaeedBuilding\tenantinfo.cpp:56: warning: C4566: character represented
by universal-character-name '\u0633' cannot be represented in the current code page (1252)

در ضمن من Qt رو برای VS هم نصب کردم و اونجا هم که برنامه‌رو کامپایل کردم همچنان این مشکل پابرجاست

با تشکر فراوان

حامد مصافی
جمعه 03 آذر 1391, 23:29 عصر
اینو بنویس ابتدای فایل کد


#pragma execution_character_set("UTF-8")

saeedIRHA
شنبه 04 آذر 1391, 00:38 صبح
با سلام

این کارو کردم ولی‌ فرقی‌ نکرد ، فقط به warning‌ ها این پیغام هم اضافه شد:


warning: C4068: unknown pragma

حامد مصافی
شنبه 04 آذر 1391, 00:46 صبح
مگه از ویژوال استودیو استفاده نمی‌کنی؟ ببین این هم خطا میده؟



QString msg = QString::fromUtf8(_T"س");

alamate_aoal
شنبه 04 آذر 1391, 04:43 صبح
و تا اونجا که من دیدم Qt Creator تنها وقتی‌ کد octal کاراکتر هارو بجای کارکترهای UTF-۸ میذاره که شما اون کد رو در desinger نوشته باشین نه در سورس کد(هنگام طراحی GUI)فرقی نمیکنه , فایل xml خروجی دیزاینر(ui.) هم دست آخر توسط uic به کد ++C تبدیل میشه, نحوه نگارش کاراکترهای غیر اسکی توسط uic به همون صورتی هست که در پست قبلی نوشتم. پس شما هم مجازید این کار رو بکنید.

برای استفاده از اون دایرکتیو ظاهرا باید یه hotfix رو اعمال کنید($M (http://support.microsoft.com/kb/2284668))


این روش رو هم تست کن:

از طریق کنترل پنل Locale سیستمت رو به Persian تغییر بده
Control Panel -> Region and Language -> Administrative -> Change System Lacale -> Persian

و در محیط کیوت کریتور :
Tools -> Options -> Text Editor -> File Encoding
مقدار کامبو باکس اولی رو با UTF-8 و دومی رو با Always Delete ست کن(این تغییرات در پروژه جاری اعمال نمیشه , برای تست کیوت کریتور رو ببند و بعد از اون یک پروژه جدید بساز)

احتمالا با حذف (byte order mark (BOM و ذخیره بصورت UTF-8 مشل بر طرف میشه
9551495515

saeedIRHA
شنبه 04 آذر 1391, 16:20 عصر
مگه از ویژوال استودیو استفاده نمی‌کنی؟ ببین این هم خطا میده؟



QString msg = QString::fromUtf8(_T"س");

چرا دوست عزیز من از کامپایلر Visual Studio C ++ ۲۰۱۰ استفاده می‌کنم اما در محیط Qt Creator خودش از
برنامهٔ jom استفاده می‌کنه بجای nmake بعد جالب هست که توابع API ویندوز
رو هم نمیتونم ازش استفاده کنم (وقتی‌ کد رو در Qt Creator می‌خوام کامپایل کنم)
و وقتی‌ در کد مینویسم برنامه کامپایل نمی‌شه ، حتا توابعی مثل MessageBox خود ویندوز که در هدر Windows.h هست

با تشکر از شما دوست عزیز alamate_aoal ، با حذف گزینهٔ BOM مشکل حل شد،
یک دنیا ممنون

alamate_aoal
یک شنبه 05 آذر 1391, 00:54 صبح
استفاده از win32 API در کیوت سخت نیست

#ifdef Q_OS_WIN32
#include <qt_windows.h>
#endif

در فایل پروژه هم این رو بنویس

win32: LIBS += -luser32

void MainWindow::on_pushButton_clicked()
{
Beep(500,500);
MessageBox( this->winId(), L"Text", L"Caption", MB_ICONQUESTION | MB_OK );
}