PDA

View Full Version : تبدیل بونیکد به character set محلی



saffari2005
یک شنبه 29 آبان 1384, 16:44 عصر
سلام
همونطور که می دونید یونیکد حروف رو به صورت اصلی ذخیره میکنه یعنی کد مربوط به شکل حروف رو ذخیره نمی کنه ( شکل اول ، وسط یا آخر )و در مقابل در کارکتر ست های محلی که برای فارسی استفاده می شود هر کدام از اشکال کد مربوط به خود دارند.حال اگر بخواهیم یک تبدیل کننده از یونیکد به این کاراکتر ست ها داشته باشیم با مشکل مواجه خواهیم شد.اینکه مثلا کد مربوط به "ب" برای شکل وسط است یا آخر که در یونیکد با یک کد ذخیره می شود.یک روش این است که هنگام خواندن کد های فایل یونیکد جای حروف رو هم با توجه به حرف بعدی و قبلی تشخیص بدیم که کار سختی است.
می خواستم بدونم کسی روش بهتری سراغ نداره؟

seyedof
یک شنبه 29 آبان 1384, 18:32 عصر
سلام
برای کارهای گرافیکی میخواهید؟
ممنون علی

saffari2005
دوشنبه 30 آبان 1384, 09:32 صبح
سلام
نه.کار گرافیکی نیست.

seyedof
دوشنبه 30 آبان 1384, 09:45 صبح
سلام
WideCharToMultiByte و MultiByteToWideChar
ممنون علی

saffari2005
دوشنبه 30 آبان 1384, 10:27 صبح
نه ؛اینها رو استفاده می کنم.اما همونطور که توضیح دادم مشکل واسه کاراکترهای محلیه که غیر استاندارد هستند.در این صورت عمل تبدیل باید توسط کدهای دستی اعمال شود.فرضا همون حرف "ب" در یک فایل ذخیره شده با فرمت یونیکد دارای کد x0628 است .حال همین حرف دارای دو کد در یک کاراکتر ست محلی است.مثلا x08D و x08E برای دو شکل آخر و اول حرف "ب".مشکل د رتشخیص کد یونیکد است.

seyedof
دوشنبه 30 آبان 1384, 17:38 عصر
سلام
خب من تست نکردم ولیکن تابع WideCharToMultiByte از یونیکد به کدپیج تبدیل میکنه. فکر کنم در کدپیجهای غیر یونیکد همون شکلهای مختلف حروف خود بخود ایجاد میشه. یعنی اگر در رشته یونیکد شما عدد 0x628 بود این تابع خودش با توجه به اینکه حرف ب در کجا قرارداره قوانین join کردن رو اجرا میکنه و کد شکل ب مناسب رو در رشته مقصد میریزه.
کار این تابع کلا تبدیل رشته از یونیکد به کدپیجهای محلی است. اگر فرصت کنم تست میکنم و نتیجه رو میگم.
ممنون علی

saffari2005
دوشنبه 30 آبان 1384, 18:54 عصر
حرف شما درسته.اما این مساله واسه وقتیه که از کدپیج های استاندارد استفاده کنیم.اما من در این سیستم از کاراکتر ست ویژه ی خودم استفاده می کنم.

seyedof
دوشنبه 30 آبان 1384, 20:06 عصر
سلام
خب در اوون صورت که تکلیف مشخصه باید خودتون تبدیل کنید. البته اینکاری که کردید خیلی درست نیست.
ممنون علی

saffari2005
دوشنبه 30 آبان 1384, 20:25 عصر
چی درست نیست؟مجبور بودم از قوانین مجموعه تبعیت کنم.حالا که متوجه شدین پیشنهادی ندارین؟

seyedof
چهارشنبه 02 آذر 1384, 13:11 عصر
سلام
اینکه هر شرکتی برای خودش کاراکتر ست اختراع کنه درست نیست:) اینکار دیگه خیلی قدیمی شده و مال موقعی بود که فارسی درست و حسابی پشتیبانی نمیشد. الان کلی آدم نشستند و استاندارد یونیکد رو طراحی کردن واسه همین که تمام زبانها رو پشتیبانی میکنه. نمیدونم چرا بعضی شرکتها به روشهای عجیب هنوز پایبند هستن. البته بعضی جاها برای امنیت اینکار رو میکنند که اوون هم راه حلهای بهتر از این داره.
یونیکد اتفاقا به دلیل اینکه مفهوم کاراکتر براش مهمه نه شکل کاراکتر، از نظر جستجو و سورت کردن خیلی بهتر است.
به هر حال شما باید خودتون یک table بسازید که توش تبدیل حروف یونیکد به کاراکترست شرکت رو داشته باشه و قواعد join کردن حروف فارسی رو هم پیاده کنید (حروفی که از اول میچسبند، حروفی که از انتها میچسبندو...)‌ و یک جدول هم باید کد شکلهای مختلف (تنها، اول، آخر، وسط) هر حرف رو نگهداری کنه.
سورس کد ادیتور های فارسی قدیمی و تحت داس هم میتونه کمکتون کنه.
ممنون علی

saffari2005
چهارشنبه 02 آذر 1384, 13:17 عصر
سلام
بنده هم با نظر شما کاملا موافقم.من مجبور شدم بالاخره تابعی بنویسم که برای حروف چند شکلی تصمیم گیری کنه !کاری که از ابتدا می خواستم یه جوری ازش فرار کنم.ولی خب این مشکلات هنوز د رمجموعه های خصوصی هست.در هر صورت از توجهتون ممنونم.