PDA

View Full Version : آموزش: فارسی نویسی در کنسول



amin1softco
جمعه 06 دی 1392, 14:16 عصر
اول از همه توصیه می کنم دست از محیط کنسولی بردارید و برید سراغ محیط گرافیکی و MFC or Win32 ولی برای اینکه ببینیم آیا امکان فارسی نویسی در کنسول وجود دارد و آنرا به شما نشان بدهم نیاز است که یک فونت را از طریق رجیستری به کنسول ویندوز اضافه کنید برای اینکار خطوط زیر را در یک فایل متنی با پسوند .reg ذخیره و اجرا کنید کنید. و بعدش ویندوز را ریستارت یا لاگ اف لاگین کنید .


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont]
"000"="Courier New"
بعد از این مرحله باید فونت مورد نظر را انتخاب کنید روش نرم افزاریش را اینجا (http://social.msdn.microsoft.com/Forums/vstudio/en-US/2bffea84-e5a0-4fde-bd24-53cbcf1e3025/set-font-text-in-console-application?forum=vclanguage) توضیح داده است روش دستی هم روی پنجره کنسول کلیک راست کنید و در propertise نوع فونت را به Courier New و اندازه آنرا به 20 تغییر دهید و دو باره برنامه را تست کنید حاصل تصویر پیوست خواهد بود .


#include <iostream>
#include <io.h>
#include <fcntl.h>

int wmain(int argc, wchar_t* argv[])
{
_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"Testing unicode -- English -- Ελληνικά -- Español.ﻡﻼﺳ" << std::endl;
wprintf(L"seven ﺯﻭﺪﻨﯾﻭ + + ﯽﺳ ﻝﻮﺴﻨﮐ ﺭﺩ ﯽﺴﯾﻮﻧ ﯽﺳﺭﺎﻓ ﻂﻴﺤﻣ ﺖﺴﺗ");
std::cin.get();
}

لازم به ذکر است برای نمایش صحیح یونیکد از نرم افزار رایگان شتاب (http://www.shetab.com/products/farsinegar.html) استفاده شده که با کلید F5 برای یونیکد نمایشی خروجی می دهد .

cloner11
یک شنبه 13 بهمن 1392, 19:44 عصر
ممنون ولی واسه من نشد!
از borlandC++‎ استفاده میکنم ,راستی اون فایلی که مربوط به رجیستری هست رو کجا باید ذخیره کنم؟

amin1softco
یک شنبه 13 بهمن 1392, 21:22 عصر
عزیزدلم برای بورلند باید از DosBOX به همراه سپند و vgaf و اینا استفاده کنی این روش برای ویژوال استادیو و dev cpp و کامپایلر های بروز است !!
فایل رجیستری را دوبار روش کلیک می کنید تا فونت Courier New به کنسول اضافه بشود!

amin1softco
سه شنبه 27 اسفند 1392, 22:11 عصر
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <string>
using namespace std;
wchar_t CalcChar(int id, bool prev, bool next)
{
if (prev && next)
return id;
else if (next)
return id - 1;
else if (prev)
return id - 2;
else
return id - 3;

} // CalcChar

wstring Convertp(wstring m_pText){
int pch=0,nch=0,tLen=m_pText.length();
bool bp,bn;
wstring wtch=m_pText;

for (int i = 0; i < tLen; i++)
{
bp = bn = true;
if (i - 1 >= 0)
pch = wtch[i - 1];
else
pch = 32;
if (i + 1 < tLen)
nch = wtch[i + 1];
else
nch = 32;

if (pch == 32 || pch == 1575 || pch == 1608 || pch == 1688)
bp = false;
else if (pch > 1582 && pch < 1587)
bp = false;
if (nch == 32)
bn = false;

// start farsi script
switch (m_pText[i])
{
// Hamze
case 1574:
m_pText[i] = CalcChar(65164, bp, bn);
break;

// Alef
case 1575:
if (bp)
m_pText[i] = 65166;
else
m_pText[i] = 65165;
break;

// Be
case 1576:
m_pText[i] = CalcChar(65170, bp, bn);
break;

// Te
case 1578:
m_pText[i] = CalcChar(65176, bp, bn);
break;

// Se
case 1579:
m_pText[i] = CalcChar(65180, bp, bn);
break;

// Jim
case 1580:
m_pText[i] = CalcChar(65184, bp, bn);
break;

// He jimi
case 1581:
m_pText[i] = CalcChar(65188, bp, bn);
break;

// Khe
case 1582:
m_pText[i] = CalcChar(65192, bp, bn);
break;

// Dal
case 1583:
if (bp)
m_pText[i] = 65194;
else
m_pText[i] = 65193;
break;

// Zal
case 1584:
if (bp)
m_pText[i] = 65196;
else
m_pText[i] = 65195;
break;

// Re
case 1585:
if (bp)
m_pText[i] = 65198;
else
m_pText[i] = 65197;
break;

// Ze
case 1586:
if (bp)
m_pText[i] = 65200;
else
m_pText[i] = 65199;
break;

// Sin
case 1587:
m_pText[i] = CalcChar(65204, bp, bn);
break;

// Shin
case 1588:
m_pText[i] = CalcChar(65208, bp, bn);
break;

// Sad
case 1589:
m_pText[i] = CalcChar(65212, bp, bn);
break;

// Zad
case 1590:
m_pText[i] = CalcChar(65216, bp, bn);
break;

// Ta daste dar
case 1591:
if (bp)
m_pText[i] = 65220;
else
m_pText[i] = 65219;
break;

// Za daste dar
case 1592:
if (bp)
m_pText[i] = 65224;
else
m_pText[i] = 65223;
break;

// Eyn
case 1593:
m_pText[i] = CalcChar(65228, bp, bn);
break;

// Gheyn
case 1594:
m_pText[i] = CalcChar(65232, bp, bn);
break;

// Fe
case 1601:
m_pText[i] = CalcChar(65236, bp, bn);
break;

// Ghaf
case 1602:
m_pText[i] = CalcChar(65240, bp, bn);
break;

// Lam
case 1604:
m_pText[i] = CalcChar(65248, bp, bn);
break;

// Mim
case 1605:
m_pText[i] = CalcChar(65252, bp, bn);
break;

// Noon
case 1606:
m_pText[i] = CalcChar(65256, bp, bn);
break;

// He
case 1607:
m_pText[i] = CalcChar(65260, bp, bn);
break;

// Vav
case 1608:
if (bp)
m_pText[i] = 65262;
else
m_pText[i] = 65261;
break;

// Pe
case 1662:
m_pText[i] = CalcChar(64345, bp, bn);
break;

// Che
case 1670:
m_pText[i] = CalcChar(64381, bp, bn);
break;

// Zhe
case 1688:
if (bp)
m_pText[i] = 64395;
else
m_pText[i] = 64394;
break;

// Ke
case 1705:
m_pText[i] = CalcChar(64401, bp, bn);
break;

// Gaf
case 1711:
m_pText[i] = CalcChar(64405, bp, bn);
break;

// Ye
case 1740:
case 1610:
if (bp && bn)
m_pText[i] = 65268;
else if (bp)
m_pText[i] = 65264;
else if (bn)
m_pText[i] = 65267;
else
m_pText[i] = 65263;
break;

}
}

for (int i = 0; i < tLen; i++)
wtch[i] = m_pText[tLen - i - 1];
for (int i = 0; i < tLen; i++)
m_pText[i] = wtch[i];
return m_pText;
wtch.clear();
}

int wmain(int argc, wchar_t* argv[])
{
_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"Testing unicode -- English -- Ελληνικά -- Español.ﻡﻼﺳ" << std::endl;
//wprintf(L"seven ﺯﻭﺪﻨﯾﻭ + + ﯽﺳ ﻝﻮﺴﻨﮐ ﺭﺩ ﯽﺴﯾﻮﻧ ﯽﺳﺭﺎﻓ ﻂﻴﺤﻣ ﺖﺴﺗ");
std::wcout << Convertp(L"ای ایران ای مرز پر گهر")<< std::endl;;

std::cin.get();
}

در این قطعه کد تبدیل به یونیکد نمایشی توسط کد و درون برنامه انجام می شه و شما نیازی به شتاب فارسی نگار ندارید و فقط باید از تابع Convertp استفاده کنید .

mmvalinezhad
چهارشنبه 28 اسفند 1392, 21:59 عصر
#include <iostream>

#include <io.h>
#include <fcntl.h>

int wmain(int argc, wchar_t* argv[])
{
_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"Testing unicode -- English -- Ελληνικά -- Español.ﻡﻼﺳ" << std::endl;
wprintf(L"seven ﺯﻭﺪﻨﯾﻭ + + ﯽﺳ ﻝﻮﺴﻨﮐ ﺭﺩ ﯽﺴﯾﻮﻧ ﯽﺳﺭﺎﻓ ﻂﻴﺤﻣ ﺖﺴﺗ");
std::cin.get();
}


دوست عزیز
من در dev c++ امتحان کردم،کامپایل نشد.
چنین اروری می دهد:
117167

amin1softco
پنج شنبه 29 اسفند 1392, 00:25 صبح
این کد در ویزوال استادیو ورژن 2005 تا 2012 در ویندوز 7-8 تست شده و اینکه Dev-CPP گویا از wcin و wcout پشتیبانی نمی کند شما می توانید از دستور system("chcp 1256") برای یونیکد و wprintf استفاده کنید http://wololo.net/talk/viewtopic.php?f=5&t=3541

turn-off
یک شنبه 14 اردیبهشت 1393, 15:30 عصر
سلام
لطفا یه نفر به من جواب بده
خیلی فوریه
من openglcontrol رو توی برنامه اضافه کردم (visual c++(
حالا میخوام داخلش فارسی بنویسم یا اصلا یه متن
میشه یک نفر کمکم کنه؟

raminlich
یک شنبه 14 اردیبهشت 1393, 18:47 عصر
سلام
دادش امین میگی برین mfc اول بگین اینکه نیازی هست قبل شروع mfc کامل با دستورات در کنسول اشنا باشیم یا در حد خیلی کم می شه شروع کرد کلن بگم من از محیط های گرافیکی چیزی سرم نمی شه اگه میشه بگین از کجا شروع کنم کامپایلرم هم DEV با VS