PDA

View Full Version : راهی خوندن جملات فارسی از فایل متنی



white tower
سه شنبه 20 بهمن 1388, 12:21 عصر
سلام.
فرض کنیم که یه فایل داریم که توش جملات فارسی ذخیره شده با پسوند txt و فایل هم در حالت متنی هست.حالا می خوایم از این فایل یه رشته از اطلاعات رو بخونیم و نمایش بدیم.هم در ویندوز که از کد اسکی استفاده می کنه و هم در لینوکس که یونیکد هست چه راهی یا راههایی برای اینکار هست که اطلاعات بعد از خوندن درست نمایش داده بشه.تو لینوکس امتحان کردم اما حروف جدا جدا چاپ میشن.تو ویندوز که یه مورد دیگه است.پس سوالم شد دو تا.چرا تو لینوکس حروف جدا جدا چاپ میشن و تو ویندوز چیکار باید کرد که چاپ بشن.
ممنون

tdkhakpur
سه شنبه 20 بهمن 1388, 14:26 عصر
ربطی به خواندن داده ها از فایل ندارد شما باید تبدیل داده ها را بعد از خواندن داده ها از فایل انجام بدید.
این کار هم با مقایسه تک تک کارکترها با محیط مربوطه هست یعنی مثلا حرف ی موجود در داخل فایل را با مشابه ان کاراکتر در در محیط ویندوز یا لینوکس انجام و تغییر بدید.

white tower
چهارشنبه 21 بهمن 1388, 22:14 عصر
ربطی به خواندن داده ها از فایل ندارد شما باید تبدیل داده ها را بعد از خواندن داده ها از فایل انجام بدید.
این کار هم با مقایسه تک تک کارکترها با محیط مربوطه هست یعنی مثلا حرف ی موجود در داخل فایل را با مشابه ان کاراکتر در در محیط ویندوز یا لینوکس انجام و تغییر بدید.
خیلی متوجه منظورتون نشدم.من هم بیشتر منظورم روی نمایش کاراکتر ها بود.خوندن که عملا نباید فرقی بکنه.یه مساله دیگه هم هست مگه نباید برای خوندن کاراکتر های یونی کد دو بایت بخونیم.بعد برای نمایش کاراکتر دوبایتی چیکار باید کرد؟
بعد هم مساله ای که مزبوط به نمایش هست و شما فرمودید که باید تک تک مقایسه بشن رو لطف بفرمایید برای این بی سواد بیشتر توضیح بفرمایید.اگه یه نمونه کد کوچیک بذارید خیلی عالی میشه.

tdkhakpur
شنبه 24 بهمن 1388, 22:24 عصر
یه مساله دیگه هم هست مگه نباید برای خوندن کاراکتر های یونی کد دو بایت بخونیم.بعد برای نمایش کاراکتر دوبایتی چیکار باید کرد؟

نخیر این حالت فقط برای آوردن کاراکتر بر روی کنسول صدق میکند نه فایل - البته اگر نرم افزار شما احتیاج به این داشته باشد که شما از کدهای دوبایتی استفاده کنید چیزی جداست ولی در حالت استاندارد شما باید داده ها را بصورت تک بایت بر روی فایل ذخیره کنید به هر صورت شما برای اینکه نشان بدید کدام کلید مورد نظر شماست احتیاج به یک بایت دارید مگر اینکه یک کد 10 بایتی را هم در ابتدای فایل به عنوان نوع زبان قید کنید.

بعد هم مساله ای که مزبوط به نمایش هست و شما فرمودید که باید تک تک مقایسه بشن رو لطف بفرمایید برای این بی سواد بیشتر توضیح بفرمایید.اگه یه نمونه کد کوچیک بذارید خیلی عالی میشه.
ببینید کد نوشتن احتاج نیست به فرض حرف ی برای شما با زبان فارسی نصب شده داخل ویندوز شما کد دو باینی 1016 را بدهد لذا شما وقتی فایل را خواندید با خواند حرف ی عدد 1016 را به جایش به مقصد ارسال کنید.
ولی اگر منظورتان این هست که چگونه سیستم تشخیص دهد که حرف ی جزو حروف وسط یا ابتدایی و یا آخر هست این به زبان سیستم بر میگردد و در این مورد اگر شما از کامپوننتهای استاندارد استفاده می کنید باید از قوانین استاندارد استفاده کنید.
برنامه زیر نمونه ایست فراتر از استاندارد ویندوز.

white tower
یک شنبه 25 بهمن 1388, 10:20 صبح
برنامه زیر نمونه ایست فراتر از استاندارد ویندوز. ظاهرا شما تو محیط ویژوال برنامه رو نوشتید.فایل هم که اجراییه و از سورسش خبری نیست.:چشمک:
در مورد یونیکد بودن یه برنامه کوچیک نوشتم که لازمه شما نتایج برنامه رو ببینید.
اولی در مورد کاراکتر فارسی :

#include<iostream>
using namespace std;

int main(){

char ch = 'ث';

cout << "ch :" << ch << endl;

return 0;
}
نتیجه کامپایل برنامه

35.cpp:6:12: warning: multi-character character constant
35.cpp: In function ‘int main()’:
35.cpp:6: warning: overflow in implicit constant conversion


برای حل این مشکل چیکار باید بکنم.

amin1softco
یک شنبه 25 بهمن 1388, 10:48 صبح
یک _t به تابع main اضافه کن تا یونیکد بشه


_tmain()

white tower
یک شنبه 25 بهمن 1388, 11:49 صبح
یک _t به تابع main اضافه کن تا یونیکد بشه


_tmain()

اول یه توضیح در مورد این _t اضافی بدید که چیکار می کنه.
بعد حالا برای نمایش درستش چیکار کنم؟یعنی همون حرف به همون شکل در خروجی چاپ بشه.
راهی داره؟

tdkhakpur
یک شنبه 25 بهمن 1388, 12:14 عصر
در مورد یونیکد بودن یه برنامه کوچیک نوشتم که لازمه شما نتایج برنامه رو ببینید
نتیجه درسته شما با چی کامپایل میکنید؟

بعد حالا برای نمایش درستش چیکار کنم؟یعنی همون حرف به همون شکل در خروجی چاپ بشه.
راهی داره؟
خوب قبل از اجرای کد باید فونتها لود بشوند همینطوری که نمیشه!:لبخندساده:
در ضمن فونتهای ویندوز اعتباری داخل حالت کنسول ندارند و باید خودتان فونت مربوطه را لود کنید

amin1softco
یک شنبه 25 بهمن 1388, 14:20 عصر
با این کد میشه در کنسول فارسی نوشت با هر اندازه و فونتی


#include "stdafx.h"
#include <iostream>
#include <locale>
#include <string>
#include <windows.h>

int main()
{
HANDLE hStdout;
HFONT font;
font=CreateFont(
22, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("tahoma")); // lpszFacename


HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitle(_T("Console Setfont"));
HWND hWnd = FindWindow(NULL, _T("Console Setfont"));
HDC hdc = GetDC(hWnd);
SelectObject(hdc, font);
SetBkColor(hdc,RGB(255,255,255));
TextOut(hdc, 400,140, _T("سلام به دنیا"), 12);
DeleteDC(hdc);
COORD coord2 = {62, 29};
SetConsoleCursorPosition(hout, coord2);
SetConsoleTextAttribute(hout,2);
system("PAUSE");
}



در ضمن برای اینکه کارکتر های فارسی را بتونید در کنسول نمایش بدید در ویندوز ویستا یک api هست که فونت کنسول رو عوض می کنه و وقتی فونت را به تاهما تغییر بدید کارکتر به درستی نمایش داده می شود


using namespace std;
wstring wcs = _T("سلام");
locale old = wcout.imbue(locale("") ); // "" is environment's default locale
wcout<<wcs<<"یی"<<endl;
wcout.imbue(old ); // restore old locale


__________________

white tower
یک شنبه 25 بهمن 1388, 20:25 عصر
راهی هست که سرفایل windows توش نباشه؟من تو لینوکس برنامه می نویسم و بیشتر دوست دارم این کارا رو در هر دو محیط انجام بدم.هم ویندوز هم لینوکس.قابلیت حمل برنامه اینطوری حفظ میشه.

amin1softco
یک شنبه 25 بهمن 1388, 20:57 عصر
خوب این یک نظره ممکن راه های ساده تری هم وجود داشته باشه .....
این روش بیشتر برای برنامه نویسی موبایل و کلا سیستم هایی به کار میره که اصلا از فارسی حمایت نمی کنند و به این صورت هست که شما تمام حروف و علائم را با یک فونت در قالب یک فایل bmp ذخیره می کنید و در برنامه اصلی یک آرایه تعریف کنید و قسمت دیتای فایل بیتمپ را تقسیم بندی می کنید یعنی هر خانه از آرایه دارای اطلاعات یک حرف یا نشانه خط فارسی باشه و برای خودتون یک استانارد جدید تعریف کنیدبرای مثا :
ش = A
س=S
و معادل سازی کنید برای نمایش هم که دیگه با تابع putpixel می تونید تمام حروف را به نمایش در بیارید با هر فونت و سایزی البته اگر یکمی سرچ کنید تابع های آماده برای این کار هم وجود داره ولی این کار کلیت بیشتری داره در ویندوز لینوکس یا هر سیستم عاملی که برنامه برای اون کامپایل بشه قابل اجراست .
_______
اما اگر بتونید کاری کنید که استاندارد فونت کنسول عوض بشه یا خودتون تغیرش بدید که مثلا 0 تا 255 بشه از 0 تا 510 و از 255 به بعد کارکتر های فارسی رو جایگزین کنید بهتره