فرض کنید قصد دارید یک قطعه کد پیشین تغییر Encoding از ویندوز عربی، به یونیکد را که در Full .NET Framework به خوبی کار میکند، در NET Core. اجرا کنید:
به محض اجرای این قطعه کد، استثنای ذیل را دریافت خواهید کرد:
عنوان میکند که encoding مخصوص windows-1256 را نمیشناسد. این تغییری است که در نحوهی ثبت سایر Encodings غیریونیکد صورت گرفتهاست.
معرفی اسمبلی System.Text.Encoding.CodePages
تمام Encodings غیریونیکد به اسمبلی ویژهای به نام System.Text.Encoding.CodePages منتقل گردیدهاند و به صورت پیشفرض هم هیچکدام از آنها در سیستم معرفی و ثبت نشدهاند.
به همین منظور ابتدا باید وابستگی ذیل را به فایل csproj برنامه اضافه کرد:
معرفی کل مجموعهی Encodings غیریونیکد به برنامه
پس از بازیابی این وابستگی با اجرای دستور dotnet restore، اکنون میتوان کل مجموعهی Encodings موجود در آنرا به سیستم معرفی نمود:
اینکار نیز باید یکبار در طول عمر برنامه انجام شود. به همین جهت میتوان این معرفی را در آغاز برنامه انجام داد و یا میتوان آنرا مانند مثال فوق به یک سازندهی استاتیک منتقل نمود. در این حالت بدون هیچگونه تغییری در کدهای پیشین، امکان اجرای آنها وجود خواهد داشت.
امکان دسترسی به تنها یک Encoding ویژه
قطعه کد عنوان شده، تمام Encoding موجود در اسمبلی System.Text.Encoding.CodePages را به صورت یکجا به سیستم معرفی میکند. مزیت آن عدم نیاز به تغییری در کدهای پیشین است؛ اما اگر تنها نیاز به یکی از آنها را دارید، میتوان به صورت ذیل عمل کرد و دیگر نیازی به ذکر Encoding.RegisterProvider نیست:
var path = @"D:\file1.srt"; var data = System.IO.File.ReadAllText(path, Encoding.GetEncoding("windows-1256")); System.IO.File.WriteAllText(path, data, Encoding.UTF8);
System.ArgumentException: 'windows-1256' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. Parameter name: name
معرفی اسمبلی System.Text.Encoding.CodePages
تمام Encodings غیریونیکد به اسمبلی ویژهای به نام System.Text.Encoding.CodePages منتقل گردیدهاند و به صورت پیشفرض هم هیچکدام از آنها در سیستم معرفی و ثبت نشدهاند.
به همین منظور ابتدا باید وابستگی ذیل را به فایل csproj برنامه اضافه کرد:
<ItemGroup><PackageReference Include="System.Text.Encoding.CodePages" Version="4.3.0" /></ItemGroup>
معرفی کل مجموعهی Encodings غیریونیکد به برنامه
پس از بازیابی این وابستگی با اجرای دستور dotnet restore، اکنون میتوان کل مجموعهی Encodings موجود در آنرا به سیستم معرفی نمود:
public class MyClass { static MyClass() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); }
امکان دسترسی به تنها یک Encoding ویژه
قطعه کد عنوان شده، تمام Encoding موجود در اسمبلی System.Text.Encoding.CodePages را به صورت یکجا به سیستم معرفی میکند. مزیت آن عدم نیاز به تغییری در کدهای پیشین است؛ اما اگر تنها نیاز به یکی از آنها را دارید، میتوان به صورت ذیل عمل کرد و دیگر نیازی به ذکر Encoding.RegisterProvider نیست:
var enc1256 = CodePagesEncodingProvider.Instance.GetEncoding(1256);