PDA

View Full Version : خرجی unicode در یک فابل txt



vasilopita
چهارشنبه 01 شهریور 1391, 13:18 عصر
سلام دوستان. این تیکه برنامه منه :

#include <conio.h>
#include <fstream>
using namespace std;
void main()
{
int i=0;
while(1)
{
HWND hwnd;
int resault;
TCHAR title[MAX_PATH]={0};
Sleep(500);
hwnd=GetForegroundWindow();
resault=GetWindowText(hwnd,title,GetWindowTextLeng th(hwnd));
fstream output;
output.open("Test.txt",ios::app);
output<<title;
output.close();
}
}
وقتی فایل txt رو باز می کنم غیر از کلی عدد چیز دیگه ای نمی بینم. :افسرده:

amin1softco
چهارشنبه 01 شهریور 1391, 13:46 عصر
wchar_t buffer[] = L"\x0111\x0107\x010D";

FILE *file2 = fopen("test2.txt", "w, ccs=UTF-16LE");
fwprintf(file2, L"The string passed in was: %s\n", buffer);
fclose(file2);

wofstream (http://social.msdn.microsoft.com/Forums/da-DK/vcgeneral/thread/2f6320f0-4f04-4524-915f-420c2f30c9c3) باید استفاده کنی !!! اون L هم برای یونیکده

vasilopita
چهارشنبه 01 شهریور 1391, 16:50 عصر
دوست عزیز با راهنمایی های شما کدم رو به شکل زیر تغییر دادم :

#include <iostream>
#include <Windows.h>
#include <fstream>
#include <conio.h>
#include <tchar.h>
using namespace std;
void main()
{
int i=0;
while(1)
{
HWND hwnd;
int resault;
TCHAR title[500]={0};
Sleep(2000);
hwnd=FindWindow(NULL,_TEXT("نارنجی - Google Chrome"));
resault=GetWindowText(hwnd,title,GetWindowTextLeng th(hwnd));
FILE *output;
output=_tfopen(_TEXT("Test.txt"),_TEXT("a,ccs=UTf-8"));
fwrite(title,1,sizeof(title),output);
fclose(output);
}
}
فقط یه مشکل دارم و یه سوال:
مشکل اینه که نمی دونم چرا هیچ وقت حرف آخر رو write نمی کنه ؟؟؟؟!!!!
و سوالم اینه که من اول مد fopen رو unicode گذاشته بودم و ازاونجایی که حروف فارسی رو write نمی کرد اونو به utf-8 تغییر دادم. ansii و unicode رو می دونم چی هستن ولی utf-8 و utf-16le رو نه! لطفا اینا رو هم مختصرا یه توضیح بدید.ممنون

pumper
چهارشنبه 01 شهریور 1391, 17:37 عصر
یوتی‌اف-۸

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری (http://fa.wikipedia.org/wiki/%DB%8C%D9%88%D8%AA%DB%8C%E2%80%8C%D8%A7%D9%81-%DB%B8#mw-head)، جستجو (http://fa.wikipedia.org/wiki/%DB%8C%D9%88%D8%AA%DB%8C%E2%80%8C%D8%A7%D9%81-%DB%B8#p-search)
یوتی‌اف-۸ (به انگلیسی (http://fa.wikipedia.org/wiki/%D8%B2%D8%A8%D8%A7%D9%86_%D8%A7%D9%86%DA%AF%D9%84% DB%8C%D8%B3%DB%8C): UTF-8) نوعی نویسه (http://fa.wikipedia.org/wiki/%D9%86%D9%88%DB%8C%D8%B3%D9%87_%28%D8%B1%D8%A7%DB% 8C%D8%A7%D9%86%D9%87%29) کدگذاری برای نوشتار است که فرمت 8 بیت را رمزگذاری می‌کند و در مجموعه یونیکدهای اسکی (http://fa.wikipedia.org/wiki/%D8%A7%D8%B3%DA%A9%DB%8C_%28%D8%A7%D8%B3%D8%AA%D8% A7%D9%86%D8%AF%D8%A7%D8%B1%D8%AF%29) طراحی شده و برای جلوگیری از مشکلات endianness در یوتی‌اف-16 و یوتی‌اف-32 ساخته شده است. بییش از نیمی از وب سایت‌ها در سراسر جهان از این یونی‌کد (http://fa.wikipedia.org/wiki/%DB%8C%D9%88%D9%86%DB%8C%E2%80%8C%DA%A9%D8%AF) کدگذاری می‌شوند. به طور پیش فرض این نویسه کدگذاری در در سیستم عامل (http://fa.wikipedia.org/wiki/%D8%B3%DB%8C%D8%B3%D8%AA%D9%85_%D8%B9%D8%A7%D9%85% D9%84)، زبان‌های برنامه‌نویسی (http://fa.wikipedia.org/wiki/%D8%B2%D8%A8%D8%A7%D9%86%E2%80%8C%D9%87%D8%A7%DB%8 C_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9 %86%D9%88%DB%8C%D8%B3%DB%8C)، رابط برنامه‌نویسی نرم‌افزار (http://fa.wikipedia.org/wiki/%D8%B1%D8%A7%D8%A8%D8%B7_%D8%A8%D8%B1%D9%86%D8%A7% D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C _%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8% A7%D8%B1) و نرم‌افزارهای کاربردی (http://fa.wikipedia.org/wiki/%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8%A 7%D8%B1_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C ) مورد استفاده قرار می‌گیرد. هم‌چنین این نویسه از مهم‌ترین یونیکدهای کدگذاری در فونت‌ها و نوشتارهای فارسی در صفحات وب و ... محسوب می‌شود.

amin1softco
چهارشنبه 01 شهریور 1391, 18:55 عصر
منم نمی دونم ولی فایل های تکست یک BOM برای مشخص کردند نوع فرمت فایل دارند شیاد مربوط به اون باشه مقدار sizeof(title) را دستی زیاد کنید ببنید فرقی می کنه!؟

بزارید یک داستانی رو با هم مطالعه کنیم :دی

ISO 10646 در اصل یک مجموعه کارکتری 31 بیت تعریف می کنه .زیر مجموعه هایی از 2^16 کارکتر با عناصر مجزا و 16 بیت کم ارزش تر پلن های planes از UCS نامیده می شه
بیشتر کارکتر های معمولی در استاندارد های قبلی در اولین plane (0x0000 to 0xFFFD) که Basic Multilingual Plane (BMP) نامیده می شه یا plane 0 قرار گرفتند کارکتر هایی که بعداً اضافه می شه به این 16 بیت بیشتر برای برنامه های خاص از قبیل اسکریپت تاریخی و نشانه گذاری های علمی استفاده می شه در پلن های فعلی هنوز کارکتری قرار نگرفته خارج از 21 بیت که پتانسیل اضافه شدن 1 میلیون کارکتر در آینده رو داره

یونیکد چیه ؟
در سال 1980 دو تا سازمان آمریکایی می خواستند یک مجموعه کارکتری واحد جهانی ایجاد کنند یکی iso و دیگیری unicode project بعداً گفتند دو مجموعه کارکتری چیزی نیست که جهان بهش نیاز داشته باشه و در سال 1991 این دو به همدیگه ملحق شدند تا یک جدول واحد کارکتری ایجاد کنند گرچه هر دو پروژه موجوده ولی به توافق رسیدند که از استاندارد ISO 10646 استفاده کنند و جدول کارکتریش رو بدون تغییر حفظ کنند و تمام ورژن های یونیکد با هم سازگاره و همیشه کارکتر های جدید به ادامه جدول یونیکد قبلی اضافه می شود.

پس تفاوت استاندارد ISO 10646 و یونیکد چیه ؟
استاندارد یونیکد بوسیله کنسرسیوم یونیکد منتشر می شه و مربوطه به سطح 3 پیاده سازی ISO 10646 است و تمام کارکتر ها در هردو استاندارد در یک مکان هستند و نام مشترکی دارند.

UTF-8 چیه ؟
یونیکد و ucs قبل از هر چیزی فقط یک عدد به هر کارکتر اختصاص می دهند . چندین روش برای چگونگی نمایش دنباله ایی از کارکتر ها یا عدد مربوط به آنها به عنوان دنباله ایی از بایت ها وجود داره دوتا از مشهور ترین کد کردن ها ,ذخیره نوشته یونیکد به عنوان دنباله ایی 2 یا 4 بایتی است کلمات رسمی برای این کدگذاری ها به ترتیب UCS-2 و UCS-4 است مگر طور دیگه ایی مشخص شده باشه در اینجا بایت با ارزش بیشتر اول میاد (Bigendian تبدیل) یک فایل ASCII یا Latin-1 به سادگی با درج یک بایت 0x00 در جلوی هر ASCII byte به UCS-2 تبدیل می شه اگر ما بخواهیم UCS-4 داشته باشیم مجبوریم سه بایت 0x00 قبل از هر ASCII byte وارد کنیم.
استفاده از UCS-2 یا UCS-4 در یونیکس باعث مشکلات حادی می شه . رشته هایی با این کد گذاری می تونند شامل قسمت هایی از خیلی از کارکتر های گسترده شبیه “\0” یا “/” بشوند که معنای خاصی در نام گذاری فایل ها و پارامتر توابع کتابخانه های C دارند . علاوه بر این بیشتر ابزار های یونیکس تنها با فایل های اسکی کار می کنند و نمی تونند کلمه های 16 بیت را به عنوان کارکتر ها بخوانند مگر با ویرایش های خیلی گسترده در سیستم عامل.
به این دلیل UCS-2 یک کد گذاری خارجی مناسب برای یونیکد در نام گذاری فایل ها و داخل فایل های متنی و متغیر های محیطی و ... نیست.
کد گذاری UTF-8 در ISO 10646-1:2000 تعریف شد و همچنین در RFC3629 تشریح شد همانند قسمت 3.9 از استاندارد یونیکد 4 که این مشکل را نداشت . این یک روش تمیز برای استفاده یونیکد در سیستم عامل هایی شبیه یونیکس بود.
-کارکتر های ucs U+0000 تا U+007F (ASCII)کدگذاری می شوند به سادگی به عنوان بایت ها 0x00 to 0x7F سازگاری با اسکی این به معنای اینه که آن فایل ها و رشته اه تنها شامل فقط 7 بیت کارکتر اسکی هستند که این قسمت در اسکی و utf-8 یکسان است.
-تمام کارکترهای ucs بزگتر از >U+007F کدگذاری می شوند به عنوان دنباله ایی از چندین بایت که هر کدام دارای مجموعه بیت با ارزش تر هستند بنابر این هیچ بایت اسکی (0x00-0x7F) نمی تونه ظاهر بشه به عنوان قسمتی از کارکتر دیگه.
ادامه (http://www.cl.cam.ac.uk/%7Emgk25/unicode.html)

خوب با این اوصاف معلومه utf-8 8بیتی است و کارکتر های معمول رو ساپورت می کنه و utf-16 همون ucs-2 است و utf-32 همون ucs-4 که باید کارکتر های بیشتری (چینی , ژاپنی و ...) رو ساپورت کنه ولی طرز کد گذاری و ذخیره اونها در فایل متفاوته ...
http://en.wikipedia.org/wiki/UTF-8
http://en.wikipedia.org/wiki/UTF-16
http://en.wikipedia.org/wiki/UTF-32
http://msdn.microsoft.com/en-us/library/z5hh6ee9%28v=vs.80%29.aspx