PRECONV(1) دستورهای کاربری PRECONV(1)

preconv - تبدیل کدگذاری نویسههای اسناد برای پردازش با groff

preconv [ -d ] [ -e کدگذاری ] [ فایل... ]

دستور preconv فایلهای ورودی را خوانده و نویسههای غیر اسکی را به توالیهای گریز متناسب با حروفچینی groff تبدیل میکند. هر فایل را می‌خواند، نویسه‌های کدگذاری‌شده آن را به شکلی که troff(1) بتواند تفسیر کند تبدیل نموده و نتیجه را به جریان خروجی استاندارد ارسال می‌کند.

در حال حاضر، این بدان معناست که مقادیر نویسه در محدوده ۰ تا ۱۲۷ (در US-ASCII، ISO~8859 یا یونیکد) دست‌نخورده باقی مانده و مابقی نویسه‌ها به فرم نویسه خاص groff به صورت “\[uXXXX]” تبدیل می‌شوند، که در آن XXXX یک عدد هگزادسیمال چهار تا شش رقمی متناظر با کد پوینت یونیکد است.

به‌طور پیش‌فرض، preconv همچنین یک درخواست .lf مربوط به roff را در ابتدای هر فایل درج می‌کند تا آن را برای پردازش‌های بعدی (از جمله پیام‌های تشخیصی) شناسایی نماید؛ گزینه -r مانع از این کار می‌شود.

در سناریوهای کاربردی معمول، نیازی به اجرای مستقیم preconv نیست؛ در عوض باید با گزینه‌های -k یا -K دستور groff فراخوانی شود. اگر هیچ عملوند فایل در خط فرمان مشخص نشده باشد، یا اگر فایل برابر با “-” باشد، جریان ورودی استاندارد خوانده می‌شود.

دستور preconv با استفاده از الگوریتم زیر تلاش می‌کند کدگذاری ورودی را بیابد و با اولین موفقیت متوقف می‌شود:

1.
اگر کدگذاری ورودی صراحتاً با گزینه -e مشخص شده باشد، از آن استفاده می‌کند.
2.
اگر ورودی با یک نشانگر ترتیب بایت یونیکد (BOM) آغاز شود، کدگذاری را متناسب با آن به صورت UTF-8، UTF-16 یا UTF-32 تعیین می‌کند.
3.
اگر جریان ورودی قابل پیمایش (seekable) باشد، خط اول و دوم ورودی را برای یافتن یک متغیر محلی فایل شناخته‌شده در گنو ایمکس (GNU Emacs) که کدگذاری نویسه را مشخص می‌کند، بررسی می‌نماید؛ در اینجا برای اختصار به آن «برچسب کدگذاری» (coding tag) گفته می‌شود. در صورت یافتن، از آن استفاده می‌کند.
4.
اگر جریان ورودی قابل پیمایش باشد و کتابخانه uchardet بر روی سیستم در دسترس باشد، از آن برای استنتاج کدگذاری فایل استفاده می‌کند.
5.
اگر گزینه -D یک کدگذاری را مشخص کرده باشد، از آن استفاده می‌کند.
6.
از کدگذاری مشخص‌شده توسط محلی‌سازی فعلی (LC_CTYPE) استفاده می‌کند، مگر اینکه لوکال “C”، “POSIX” یا خالی باشد، که در این حالت Latin-1 (ISO 8859-1) فرض می‌شود.

روش‌های برچسب کدگذاری و uchardet در روال بالا به یک جریان ورودی قابل پیمایش وابسته هستند؛ زمانی که preconv از یک لوله (pipe) ورودی را می‌خواند، جریان قابل پیمایش نیست و از این روش‌های تشخیص صرف‌نظر می‌شود. اگر تشخیص کدگذاری نویسه برای فایل‌های ورودی شما غیرقابل اعتماد است، ترتیبی دهید که یکی از روش‌های دیگر با استفاده از گزینه‌های -D یا -e دستور preconv یا با پیکربندی مناسب لوکال با موفقیت انجام شود. groff همچنین از متغیر محیطی GROFF_ENCODING پشتیبانی می‌کند که می‌توان آن را با گزینه -K دستور بازنویسی کرد. مقادیر معتبر برای تمام این موارد در فهرست‌های برچسب‌های کدگذاری شناخته‌شده در بخش فرعی بعدی آورده شده‌اند و همچنین تحت تأثیر پشتیبانی کتابخانه iconv قرار دارند.

ویرایشگرهای متنی که از بیش از یک کدگذاری نویسه پشتیبانی می‌کنند، به برچسب‌هایی درون فایل‌های ورودی نیاز دارند تا کدگذاری فایل را مشخص سازند. اگرچه امکان حدس زدن کدگذاری ورودی صحیح با کمک روش‌های مکاشفه‌ای که برای اکثر متون به زبان‌های طبیعی قابل اعتماد هستند وجود دارد، اما این روش‌ها قطعاً بی‌نقص نیستند. روش‌های مکاشفه‌ای ممکن است روی ورودی‌هایی که بسیار کوتاه‌اند یا نمایانگر یک زبان طبیعی نیستند با شکست مواجه شوند.

در نتیجه، preconv از قرارداد برچسب‌های کدگذاری استفاده‌شده توسط گنو ایمکس (با برخی محدودیت‌ها) پشتیبانی می‌کند. این نمادگذاری در بخش‌های ویژه‌ای از فایل ورودی که برای «متغیرهای محلی فایل» تعیین شده‌اند، ظاهر می‌شود.

دستور preconv سینتکس زیر را در صورتی که در یک کامنت roff در خط اول یا دوم فایل ورودی رخ دهد، تفسیر می‌کند. هر دو ساختار کامنت “\"” و “\#” شناخته می‌شوند، اما نویسه کنترلی (یا نویسه کنترلی بدون شکست) باید پیش‌فرض بوده و در ابتدای خط باشد. به همین ترتیب، نویسه گریز (escape character) نیز باید پیش‌فرض باشد.

-*- 
[...;] 
coding: 
encoding
[; ...] 
-*-

تنها متغیری که preconv تفسیر می‌کند “coding” است که می‌تواند مقادیر ذکرشده در زیر را بگیرد.

فهرست زیر شامل تمام مقادیر پارامتر “charset” در MIME است که به صورت غیرحساس به حروف کوچک و بزرگ توسط preconv شناخته می‌شوند:

big5, cp1047, euc-jp, euc-kr, gb2312, iso-8859-1, iso-8859-2, iso-8859-5, iso-8859-7, iso-8859-9, iso-8859-13, iso-8859-15, koi8-r, us-ascii, utf-8, utf-16, utf-16be, utf-16le

علاوه بر این، فهرست زیر از سایر برچسب‌های کدگذاری نیز شناخته می‌شود که هر یک به یک مقدار مناسب از فهرست بالا نگاشت می‌شوند:

ascii, chinese-big5, chinese-euc, chinese-iso-8bit, cn-big5, cn-gb, cn-gb-2312, cp878, csascii, csisolatin1, cyrillic-iso-8bit, cyrillic-koi8, euc-china, euc-cn, euc-japan, euc-japan-1990, euc-korea, greek-iso-8bit, iso-10646/utf8, iso-10646/utf-8, iso-latin-1, iso-latin-2, iso-latin-5, iso-latin-7, iso-latin-9, japanese-euc, japanese-iso-8bit, jis8, koi8, korean-euc, korean-iso-8bit, latin-0, latin1, latin-1, latin-2, latin-5, latin-7, latin-9, mule-utf-8, mule-utf-16, mule-utf-16be, mule-utf-16-be, mule-utf-16be-with-signature, mule-utf-16le, mule-utf-16-le, mule-utf-16le-with-signature, utf8, utf-16-be, utf-16-be-with-signature, utf-16be-with-signature, utf-16-le, utf-16-le-with-signature, utf-16le-with-signature

پسوندهای پایانی “-dos”، “-unix” و “-mac” در برچسب‌های کدگذاری (که نشان‌دهنده شیوه انتهای خط استفاده‌شده در فایل هستند) به منظور مقایسه با برچسب‌های فوق نادیده گرفته می‌شوند.

اگرچه preconv تمامی برچسب‌های کدگذاری ذکرشده در بالا را می‌شناسد، اما به خودی خود تنها قادر به تفسیر سه کدگذاری است: Latin-1، صفحه کد 1047 و UTF-8. اگر پشتیبانی از iconv در زمان کامپایل پیکربندی شده باشد و در زمان اجرا در دسترس باشد، تمامی موارد دیگر به توابع کتابخانه iconv ارسال می‌شوند که ممکن است رشته‌های کدگذاری بسیار بیشتری را بشناسند. دستور “preconv -v” مشخص می‌کند که آیا پشتیبانی از iconv پیکربندی شده است یا خیر.

استفاده از iconv بدان معناست که نویسه‌هایی در ورودی که نمایانگر کد پوینت‌های نامعتبر برای آن کدگذاری هستند، ممکن است از جریان خروجی حذف شوند یا به نویسه جایگزین یونیکد (U+FFFD) نگاشت گردند. مثال‌های زیر را با ورودی “café” (به “e” با علامت اکسان حاد توجه کنید) مقایسه نمایید که به دلیل طول کوتاهش، استنتاج کدگذاری استفاده‌شده را به چالش می‌کشد:

printf 'caf\351\n' | LC_ALL=en_US.UTF-8 preconv
printf 'caf\351\n' | preconv -e us-ascii
printf 'caf\351\n' | preconv -e latin-1

سرنوشت نویسه با نشان “e” در هر حالت متفاوت است: در حالت اول، uchardet در تشخیص کدگذاری ناکام می‌ماند (هرچند کتابخانه در سیستم شما ممکن است رفتار متفاوتی داشته باشد) و preconv به تنظیمات لوکال بازمی‌گردد، جایی که مقدار هشت‌هشتی ۳۵۱ آغازگر یک توالی ناکامل UTF-8 است و منجر به نویسه جایگزین یونیکد می‌شود. در حالت دوم، این نویسه در کدگذاری ورودی اعلام‌شده US-ASCII قابل بازنمایی نیست و توسط iconv دور ریخته می‌شود. در حالت آخر، به درستی تشخیص داده شده و نگاشت می‌شود.

دستور preconv نمی‌تواند هیچ تبدیلی روی ورودی‌هایی که قادر به دیدن آن‌ها نیست انجام دهد. از جمله نمونه‌های آن می‌توان به فایل‌هایی اشاره کرد که توسط پیش‌پردازنده‌های اجراشونده بعدی جای‌گذاری می‌شوند، از جمله soelim(1)؛ فایل‌های گنجانده‌شده توسط خود troff از طریق درخواست‌های “so” و مشابه آن؛ و تعاریف رشته‌ای که از طریق گزینه خط فرمان -d به troff منتقل می‌شوند.

دستور preconv فرض می‌کند ورودی آن از نویسه گریز پیش‌فرض، یعنی بک‌اسلش \ استفاده می‌کند، و توالی‌های گریز نویسه‌های خاص را بر همین اساس می‌نویسد.

-h و --help پیام راهنمای نحوه استفاده را نمایش می‌دهند، در حالی که -v و --version اطلاعات نسخه را نشان می‌دهند؛ همگی پس از آن خارج می‌شوند.

ارسال پیام‌های عیب‌یابی به جریان خطای استاندارد.
در صورت شکست تمام روش‌های تشخیص، کدگذاری جایگزین fallback-encoding را گزارش می‌کند.
تشخیص خودکار را نادیده گرفته و کدگذاری encoding را فرض می‌کند؛ گزینه -K در groff را ببینید.
فایل‌ها را به صورت خام (raw) می‌نویسد؛ درخواست‌های .lf را اضافه نمی‌کند.

groff(1), iconv(3), locale(7)

مه ۲۰۲۵ groff