در ویندوز XP زمانیکه زبان سیستم و همچنین کشور جاری به ایران تنظیم شود، VS.Net فایلهای ANSI را از نوع ANSI-Windows-1256 (یا همان ANSI-Arabic) در نظر میگیرد و مشکلی هم برای ذخیره دادههای یونیکد در این نوع فایلهای ANSI ویژه نخواهد بود (الزامی وجود ندارد که این فایلها حتما به فرمت UTF8 ذخیره شوند). اما در ویندوز 7 با همان تنظیمات، VS.Net این فایلها را با encoding از نوع windows-1252 تشخیص میدهد و پس از کامپایل برنامهای که قبلا مشکل نداشت، اینبار همه چیز به همه ریخته خواهد بود. شاید اینطور به نظر برسد که این فایلها خراب شدهاند، ولی خیر. مشکلی وجود ندارد؛ فقط فرمت encoding خواندن آنها باید windows-1256 باشد (و نه 1252) و گرنه تخریب شده به نظر میرسند.
تعداد فایلها هم زیاد است و نیاز به یک روش سریع برای رفع این مشکل وجود داشت.
بنابراین سه عملیات باید صورت گیرد:
لیست کردن تمام فایلهای مورد نظر (فایلهای cs و aspx و امثال آن فقط)
پیدا کردن encoding جاری فایلها : کدامیک از آنها با فرمت UTF-8 ذخیره نشدهاند؟
تبدیل به یونیکد: خواندن این فایلهای غیر یونیکد یافت شده با فرمت windows-1256 و سپس ذخیره مجدد با فرمت UTF-8
که خلاصه روش انجام کار به صورت زیر است:
الف) آیا فایل جاری مورد نظر با فرمت UTF-8 with signature ذخیره شده است؟
این signature در مورد فایلهای UTF-8 به سه بایت اول فایل بر میگردد که اصطلاحا byte-order mark یا BOM گفته میشود و باید مساوی EFBBBF باشد. چون فایلهای ANSI این امضا را ندارند، در یک سیستم ممکن است 1256 خوانده شوند و در یک سیستم دیگر 1252 یا نوعهای ANSI دیگر بسته به تنظیمات جاری سیستم و مشکل اصلی از VS.Net نیست.
/// <summary>
/// آیا فایل مورد نظر با فرمت یونیکد دارای امضا ذخیره شده است؟
/// </summary>
/// <param name="filePath">فایل ورودی</param>
/// <returns>بله یا خیر</returns>
public static bool IsUTF8(string filePath)
{
using (FileStream file = new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read))
{
if (file.CanSeek)
{
byte[] bom = new byte[4]; // Get the byte-order mark, if there is one
file.Read(bom, 0, 4);
if ((bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)) // utf-8
{
return true;
}
else
{
return false;
}
}
else
{
//احتمالا فایل بایناری است
return false;
}
}
}
ب) خواندن یک فایل ANSI عربی با فرمت windows-1256 بدون تخریب اطلاعات آن و سپس ذخیره سازی با فرمت UTF-8
/// <summary>
/// تبدیل یک فایل انسی عربی به یونیکد دارای امضاء
/// </summary>
/// <param name="path">مسیر ورودی</param>
public static void FixWindows1256(string path)
{
try
{
//باز کردن فایل با فرمت انسی عربی و تبدیل به یونیکد
string data = File.ReadAllText(path, Encoding.GetEncoding("windows-1256"));
//نوشتن حاصل یونیکد در جای قبلی با فرمت مربوطه
File.WriteAllText(path, data, Encoding.UTF8);
}
catch (Exception ex)
{
//دسترسی وجود ندارد یا امثال آن
Console.WriteLine(ex.ToString());
}
}
پ.ن.
جالب اینجا است که این نوع فایلهای ANSI عربی در وب زیاد پیدا میشوند. برای مثال اینجا کلیک کنید. تمام این نوع فایلها را با متد فوق میتوان بدون تخریب اطلاعات به فرمت UTF-8 دارای امضاء اصلاح کرد.
اشتراکها
پیاده سازی HTML5 saveAs() FileSaver
api-key دریافت شده و جایگزین. مشکل از text/xml; charset=utf-8). If using a custom encoder, شاید باشه. آیا اجرای این مثال در لوکال مشکل دارد؟
نظرات مطالب
به روز رسانیهایی جهت VS2010
خیر. تابحال به این مشکل برنخوردم و علت آن هم این است که همیشه این یک مورد زیر را برای فایلهای جدید و یا موجود در پروژه رعایت میکنم:
File menu -- Save with advanced options --- Select UTF-8 with signature
File menu -- Save with advanced options --- Select UTF-8 with signature
in this article, I will show how to take a medium-small demo app written using Visual Studio 2013, ASP.NET 4.5, VC 5, and Entity Framework 6 and turn it into a working ASP.NET 5 app employing Visual Studio 2015, MVC 6 and Entity Framework 7. And the new app will happily run on either the .NET 4.6 CLR or the .NET Core CLR. Let's get started.
درسته. جدول حداقل و حداکثر رو میشه در سایت زیر هم دید:
http://unicode.org/faq/utf_bom.html
ولی برای این حداقلها و حداکثرها، اما و اگرهای زیادی هست (در مورد عدم تداخل با یکدیگر) که در لینکهای زیر توضیح داده شده:
http://en.wikipedia.org/wiki/UTF-8
http://tools.ietf.org/html/rfc3629
رشتهها در دات نت فریم ورک از نوع UTF-16 هستند و برای اینکه به صورت صحیحی تبدیل به آرایهای از بایتها شده و در الگوریتمهای مورد نظر استفاده شوند باید به این نکته دقت داشت.
http://unicode.org/faq/utf_bom.html
ولی برای این حداقلها و حداکثرها، اما و اگرهای زیادی هست (در مورد عدم تداخل با یکدیگر) که در لینکهای زیر توضیح داده شده:
http://en.wikipedia.org/wiki/UTF-8
http://tools.ietf.org/html/rfc3629
رشتهها در دات نت فریم ورک از نوع UTF-16 هستند و برای اینکه به صورت صحیحی تبدیل به آرایهای از بایتها شده و در الگوریتمهای مورد نظر استفاده شوند باید به این نکته دقت داشت.
اشتراکها
کتابخانه angular-checkboxes
If you are used to manipulate HTML forms, you probably know that each checkbox is a separate variable (or maybe an ngModel with AngularJS). Demo
Sometimes, it could be usefull to manipulate all these checkboxes as a unique array.
angular.checkboxes
module lets you turn your list of checkboxes into a unique destination array, providing :
- two-way binding: manipulate the destination array will check/uncheck the checkboxes AND check/uncheck the checkboxes will modify the destination array.
- no isolated scope for each checkbox: the directive does not create new child scope.
- a mtCheckboxController: internal controller can be injected to other directives.