۱۳۸۷/۱۱/۲۳

فايل‌هاي chm و مشكل فارسي - قسمت دوم


بر اساس جستجوهايي كه انجام داده‌ام، CHM پشتيباني كاملي را از يونيكد انجام نمي‌دهد (مشكل جستجو و همچنين ايندكس كردن).
اما با ترفندي مي‌توان اين مساله را حل كرد و آن هم تبديل encoding فايل‌ها به عربي است (windows-1256). در اين حالت هم جستجو كار مي‌كند و هم عنوان صفحات هنگام جستجو در ليست موارد ياد شده درست نمايش داده مي‌شود و صفحه add to favorites نيز مشكلي در نمايش عنوان‌هاي صفحه‌ها نخواهد داشت. روش كار به شرح زير است:

الف) encoding تمام فايل‌هاي html خود را به صورت زير تغيير دهيد (از utf-8 به windows-1256):

<meta content="text/html; charset=Windows-1256" http-equiv="Content-Type">

ب) محتواي تمام فايل‌هاي html خود را يكبار با فرمت ويندوز 1256 ذخيره كنيد. براي اين منظور در دات نت به سادگي زير مي‌توان عمل كرد:
using System.IO;
using System.Text;

public static void SaveAs1256(string fileName)
{
string content = File.ReadAllText(fileName);
File.WriteAllText(fileName, content, Encoding.GetEncoding("windows-1256"));
}

شايد بعضي از ويرايشگرهاي متني هم اين مورد را پشتيباني كنند.(مانند ويرايشگر ويژوال استوديو)

ج) اصلاح فايل hhp پروژه خود
فايل hhp مربوط به html help work shop را باز كنيد. (همان فايل پروژه ساخت راهنما)
اگر مثال قبل را دنبال كرده باشيد، محتواي فايل آن چيزي شبيه به خطوط زير خواهد بود:

[OPTIONS]
Compatibility=1.1 or later
Compiled file=test.chm
Contents file=Table of Contents.hhc
Default Window=win1
Default topic=page1.html
Display compile progress=No
Full-text search=Yes
Index file=Index.hhk
Language=0x429 Farsi
Title=راهنماي يك

[WINDOWS]
win1=,"Table of Contents.hhc","Index.hhk","page1.html","page1.html",,,,,0x3420,,0x304e,,,,,,2,,0


[FILES]
page1.html
page2.html

[INFOTYPES]

نياز است تا آن‌را به صورت زير ويرايش كرد تا فرمت 1256 به آن اعمال شود:
به قسمت options چند سطر زير را اضافه كنيد: (زبان فارسي و فونت تاهوماي عربي)

Default Font=Tahoma,8,178
Language=0x429 Farsi

اكنون پس از كامپايل مجدد مجموعه، مشكلي در مورد جستجو يا به هم ريختگي عنوان‌ها ديگر وجود نخواهد داشت.

محض نمونه، كل وبلاگ جاري را به يك فايل chm تبديل كرده‌ام كه ‌آن‌را از آدرس زير مي‌توانيد دريافت نمائيد:
دريافت فايل

براي آزمايش، يك عبارت فارسي را در آن جستجو نمائيد.


پ.ن.
اين راه حلي است كه به نظر من رسيده و جواب داده. اگر شما با encoding هاي ديگر هم جواب گرفته‌ايد (مشكل جستجوي فارسي حل شده) لطفا پيغام بگذاريد. با تشكر.