۱۳۹۰/۰۸/۰۳

آشنايي با BOM !


سؤال: دو فايل زيرنويس فارسي داريم، هر دو هم با فرمت UTF-8 ذخيره شده‌اند. يكي در دستگاه DVD Player درست نمايش داده مي‌شود و ديگري خير. چرا؟!
هر دو فايل را اگر در يك اديتور متني باز كنيم تفاوتي قابل مشاهده نيست؛ اما در يك Hex Editor خير:



در سه بايت اول فايل با هم تفاوت دارند و اصطلاحا به اين سه بايت BOM يا Byte order mark گفته مي‌شود. توسط آن مي‌توان تشخيص داد كه فايل جاري اولا آيا با فرمت يونيكد ذخيره شده است يا خير ثانيا كدام حالت به كار گرفته شده است؛ آيا UTF-8 است يا UTF-16 يا ...؟
در حالت UTF-8 مقدار BOM مساوي با 0xEF,0xBB,0xBF بوده و البته ذكر آن اختياري است. به نظر اين دستگاه DVD Player ياد شده، به اين نكته حساس است.
در دات نت جهت اطمينان از نوشته شدن BOM در فايل توليدي، نياز است encoding نهايي صريحا ذكر گردد. براي مثال هرچند خروجي File.WriteAllText حتي بدون ذكر encoding آن، UTF-8 است، اما BOM را به همراه ندارد (^). براي رفع اين مساله بايد از روش زير استفاده كرد:

File.WriteAllText(path, data, Encoding.UTF8);