1. Defolt kodlaşdırma
StreamReader və StreamWriter ilə işləyəndə onlar defolt kodlaşdırmadan istifadə edirlər.
Əgər sən yazırsan:
using var reader = new StreamReader("myfile.txt");
və ya
using var writer = new StreamWriter("output.txt");
.NET defolt kodlaşdırmanı seçir. Windows-da adətən bu UTF-8 olur (tez-tez BOM olmadan), amma köhnə tətbiqlərdə və ya digər sistemlərdə davranış fərqli ola bilər.
Əksər hallarda UTF-8 yaxşı seçimdir: bütün dilləri dəstəkləyir və ingilis dilindəki mətnlər üçün kompakt saxlayır (rus dilində də yaxşı işləyir). Amma əgər fayl başqa kodlaşdırmada yaradılıbsa (məsələn, Windows-1251), və ya onu başqa proqramlar oxuyacaqsa və onlar müəyyən kodlaşdırma gözləyirlərsə, sənə açıqca düzgün kodlaşdırmanı göstərmək lazımdır.
2. StreamReader və StreamWriter üçün kodlaşdırmanın göstərilməsi
Konstructor variantları
Həm StreamReader, həm də StreamWriter konstruktorlarda System.Text.Encoding tipli obyekti qəbul edə bilir.
Nümunə:
using var reader = new StreamReader("myfile.txt", Encoding.UTF8);
using var writer = new StreamWriter("output.txt", false, Encoding.UTF8);
Əgər ASCII, Windows-1251 və ya UTF-16 ilə işləmək istəyirsənsə, başqa kodlaşdırmanı göstər:
using var reader = new StreamReader("myfile.txt", Encoding.Unicode); // UTF-16
using var reader2 = new StreamReader("rus.txt", Encoding.GetEncoding("windows-1251"));
Populyar kodlaşdırmaların qısa cədvəli:
| Kodlaşdırma | C# ifadə | İzah |
|---|---|---|
| UTF-8 | |
Bütün dilləri dəstəkləyir, kompakt |
| UTF-16 (Unicode) | |
.NET-in standartı, hər simvol üçün 2 bayt |
| ASCII | |
Yalnız əsas simvollar (ing.) |
| Windows-1251 | |
Rusca, köhnə Windows proqramları |
Diqqət! Windows-1251 kimi qeyri-standart kodlaşdırmalar üçün Encoding.GetEncoding("windows-1251") metodundan istifadə et.
3. Kodlaşdırmanı göstərərək oxumaq və yazmaq
Gəlin kiçik tətbiqimizə yeni funksiya əlavə edək: faylı göstərilmiş kodlaşdırmada oxusun və nəticəni başqa fayla yazsın, orada da kodlaşdırma açıq göstərilsin. Beləliklə, sən mətnləri sistemlər arasında konvertasiya edə bilərsən!
Nümunə 1: Windows-1251 kodlaşdırmasında faylı oxuyub ekrana çıxarmaq
// Tutaq ki, fayl köhnə Windows-1251-də yaradılıb
using var reader = new StreamReader("ru_text.txt", Encoding.GetEncoding("windows-1251"));
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
Niyə bu vacibdir: Əgər kodlaşdırmanı göstərməsəydik, rus hərfləri əvəzinə dəhşətli simvollar görərdik, məsələn "УчебнРиРє".
Nümunə 2: Faylı UTF-16 (Unicode) ilə yazmaq
using var writer = new StreamWriter("utf16text.txt", false, Encoding.Unicode);
writer.WriteLine("Salam, dünya!");
writer.WriteLine("Hello, world!");
writer.WriteLine("こんにちは世界");
Nəticə: Faylı Notepad kimi redaktorda açsan, bütün simvollar gözəl görünəcək.
4. Kodlaşdırmalar arasında konvertasiya üçün kiçik utilit
Tapşırıq (müsahibələrdə tez-tez çıxır!): Text faylını Windows-1251-dən UTF-8-ə çevirmək.
string sourcePath = "ru_text_1251.txt";
string destPath = "ru_text_utf8.txt";
// Windows-1251 kodlaşdırmasında oxuyuruq
using var reader = new StreamReader(sourcePath, Encoding.GetEncoding("windows-1251"));
// UTF-8 ilə yazırıq
using var writer = new StreamWriter(destPath, false, Encoding.UTF8);
string? line;
while ((line = reader.ReadLine()) != null)
writer.WriteLine(line);
İndi ru_text_utf8.txt-i rahatlıqla VSCode, Linux, Mac-də açıb oxunaqlı mətn görəcəksən.
5. Faydalı nüanslar
Faylın hansı kodlaşdırmada olduğunu necə bilmək olar?
Bu biraz tələyə oxşayır! Adətən fayl içində öz-özünə kodlaşdırma haqda məlumat olmur (istisna: BOM-lu fayllar — bu haqda növbəti mühazirədə danışacağıq). Əgər faylı yanlış kodlaşdırmada açırsansa, nəticə — qarışıq simvollar olur.
Tipik praktik yanaşmalar:
- Əgər faylı proqramın özü yaradıbsa — həmişə oxumaq üçün eyni kodlaşdırmadan istifadə et, hansı ki yazanda istifadə olunub.
- Əgər fayl naməlum mənbədən gəlibsə — müxtəlif kodlaşdırmaları yoxla və ya spesifik utilitlərdən istifadə et ki, doğru kodlaşdırmanı müəyyən etsin.
Emoji və qeyri-adi simvollarla işləmək
UTF-8 və UTF-16 emoji və dünyanın müxtəlif dillərinin simvollarını problemsiz dəstəkləyir. Faylı emoji ilə UTF-8-də saxlayıb sonra köhnə kodlaşdırmada açmağı sına — maraqlı (və bəzən gülməli) nəticə alacaqsan.
Emoji nümunəsi:
using var writer = new StreamWriter("emoji.txt", false, Encoding.UTF8);
writer.WriteLine("Salam 👋😀🌍");
StreamReader-də avtomatik kodlaşdırma aşkarlanması
StreamReader-in bir konstruktorda detectEncodingFromByteOrderMarks parametri var:
new StreamReader(path, encoding, detectEncodingFromByteOrderMarks: true)
Əgər bu parametr true-dursa (default dəyər bu deyil!), StreamReader faylda BOM-ın mövcudluğuna baxaraq kodlaşdırmanı təxmin etməyə çalışacaq. Amma fayl BOM-suz yaradılıbsa və ya ekzotik kodlaşdırmadadırsa, təsbit işləməyə bilər.
Nə vaxt və niyə kodlaşdırmanı açıq göstərmək lazımdır?
- Çoxdilli məlumatlar: ərəb, çin, emoji və s. dəstəyi üçün.
- İnteqrasiyalar: faylı yalnız sən yox, başqa sistemlər də oxuyursa və onlar müəyyən kodlaşdırma gözləyirsə.
- Fayl ölçüsü vacibdirsə: ASCII/UTF-8 latın mətnləri üçün daha qənaətcildir, UTF-16 isə ideoqramlar üçün münasib ola bilər.
- Uyğunluq: digər tətbiqlərə export/log yaratarkən uyğunsuzluqlardan qaçmaq üçün.
6. Kodlaşdırma ilə işləyərkən tipik səhvlər
Səhv №1: faylı oxuyarkən kodlaşdırmanı açıq göstərməmək.
Rus və ya digər qeyri-latin mətni kodlaşdırma göstərmədən oxuyanda tez-tez oxunmayan "abra-kadabra" alınır.
Səhv №2: yazma və oxuma kodlaşdırmalarının uyğun gəlməməsi.
Fayl bir kodlaşdırmada yazılıb, amma başqa kodlaşdırmada açılıb — nəticə təhrif olunmuş mətn olur. Bu, OS və ya proqramlar arasında köçürmə zamanı tez-tez baş verir.
Səhv №3: dəstəklənməyən və ya qismən dəstəklənən kodlaşdırmaların istifadə olunması.
Bəzi redaktorlar BOM-siz UTF-8-lə və ya köhnə təkbaytlı kodlaşdırmalarla, məsələn Windows-1251 ilə düzgün işləməyə bilər. Bəzən əl ilə kodlaşdırmanı dəyişib sınamaq lazım gəlir.
GO TO FULL VERSION