1. Giriş
Təsəvvür edin, mühasib sizə hesabat faylı göndərib və o, "Windows-1251" (kiril əlifbası üçün köhnə kodlaşdırma) ilə saxlanıb. Sizin Java tətbiqiniz isə bütün girişləri "UTF-8" gözləyir, əks halda “şikayət edir” və hərflər əvəzinə iyerogliflər göstərir. Məsələn, yalnız "ISO-8859-1" qəbul edən bir sistemlə inteqrasiya edirsiniz. Nə etməli? Əlbəttə, faylı yenidən kodlaşdırmaq!
Yenidən kodlaşdırma — mətnin fayldan bir kodlaşdırmada oxunub başqa kodlaşdırmada saxlanılması prosesidir. Bu, sanki məktubu bir dildən digərinə köçürmək kimidir ki, alıcı mesajınızı tam başa düşsün.
Java-da yenidən kodlaşdırma necə işləyir: ümumi yanaşma
Java-da sətirlər (String) proqram daxilində həmişə Unicode-da (UTF‑16) saxlanılır. Bu o deməkdir ki, siz mətni fayldan oxuyan kimi o artıq “universal” olur və istənilən dəstəklənən kodlaşdırmada yazıla bilər. Buna görə də yenidən kodlaşdırma sadəcə belədir:
- Faylı düzgün ilkin kodlaşdırmanı göstərərək sətirlər kimi oxuyun.
- Bu sətirləri lazımi hədəf kodlaşdırmanı açıq göstərərək yeni fayla yazın.
Sxem:
[A kodlaşdırmasında fayl] --(Charset A ilə oxu)--> [Yaddaşda String] --(Charset B ilə yazı)--> [B kodlaşdırmasında fayl]
2. Yenidən kodlaşdırmanın addım-addım alqoritmi
Addım 1. İlkin və hədəf kodlaşdırmanı müəyyən edin
İlkin kodlaşdırma — ilkin faylın saxlandığı kodlaşdırmadır (məsələn, "Windows-1251"). Hədəf kodlaşdırma — nəticəni almaq istədiyiniz kodlaşdırmadır (məsələn, "UTF-8").
Addım 2. Lazımi kodlaşdırma ilə oxuma axınını açın
Files.newBufferedReader(Path, Charset) və ya klassik InputStreamReader-dan istifadə edin.
Addım 3. Lazımi kodlaşdırma ilə yazma axınını açın
Files.newBufferedWriter(Path, Charset) və ya klassik OutputStreamWriter-dan istifadə edin.
Addım 4. Sətirləri oxuyun və yeni fayla yazın
Sətir-sətir (və ya fayl kiçikdirsə, tam) oxuyun, hər sətiri yeni fayla yazın.
Addım 5. Axınları bağlayın (ən yaxşısı try-with-resources istifadə etməkdir)
Beləliklə resursların düzgün azad edilməsini təmin edirsiniz. try-with-resources konstruksiyasından istifadə edin.
3. Kod nümunəsi: Windows-1251 → UTF-8 yenidən kodlaşdırması
Gəlin Windows‑1251-dən UTF‑8-ə faylı yenidən kodlaşdıran sadə bir proqram həyata keçirək. Belə nümunə real həyatda tez-tez rast gəlinir, xüsusən rusdilli məlumatlarla işləyirsinizsə.
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
public class FileReencoder {
public static void main(String[] args) throws IOException {
// Fayl yolları
Path inputPath = Paths.get("input-1251.txt");
Path outputPath = Paths.get("output-utf8.txt");
// Windows-1251 ilkin kodlaşdırması ilə reader açırıq
try (
BufferedReader reader = Files.newBufferedReader(inputPath, Charset.forName("Windows-1251"));
BufferedWriter writer = Files.newBufferedWriter(outputPath, StandardCharsets.UTF_8)
) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine(); // sətirsonunu unutmayaq!
}
}
System.out.println("Fayl Windows-1251-dən UTF-8-ə uğurla yenidən kodlaşdırıldı!");
}
}
Burada biz oxu üçün kodlaşdırmanı açıq şəkildə göstəririk (Charset.forName("Windows-1251")) və yazı üçün (StandardCharsets.UTF_8). Sonra isə try-with-resources-dən istifadə edirik ki, səhv baş versə belə axınlar avtomatik bağlansın. writer.newLine() — faylın strukturu qorunsun deyə sətirsonu əlavə edir.
4. Vacib nüanslar və faydalı məsləhətlər
Faylın ilkin kodlaşdırmasını necə müəyyən etmək olar?
- Faylın özündə kodlaşdırmanı göstərən “etiket” olmur (istisna — BOM, amma o da həmişə rast gəlinmir).
- Faylı siz yaratmısınızsa — yazarkən istifadə etdiyiniz eyni kodlaşdırmadan istifadə edin.
- Fayl “haradansa” gəlibsə — kodlaşdırmanı göstərən redaktorda açmağı sınayın (məsələn, Notepad++, Visual Studio Code).
- Linux-da file -i fayl_adi əmri istifadə oluna bilər, amma o, kodlaşdırmanı həmişə düzgün müəyyən etmir.
Yanlış ilkin kodlaşdırmanı göstərsəniz nə baş verəcək?
“Qarışıq, anlaşılmaz simvollar” və ya simvolların itməsi ilə qarşılaşacaqsınız. Məsələn, Windows‑1251-də saxlanmış faylı UTF‑8 kimi oxusanız, kiril mətni "Привет" kimi görünəcək.
İstisnaların işlənməsi
Fayllarla işləyərkən həmişə səhvlər mümkündür: fayl tapılmadı, icazə yoxdur, kodlaşdırma yanlışdır. İstisnaları idarə edin (try-catch) və ya onları yuxarı ötürün (throws) ki, tətbiq “izahsız” dayanmasın.
Böyük fayllarla iş
Əgər fayl çox böyükdürsə (qiqabaytlarla!), göstərilən nümunələrdəki kimi sətir-sətir oxuma və yazmadan istifadə edin. Bütün faylı yaddaşa tam oxumayın — əks halda OutOfMemoryError ala bilərsiniz.
“On-the-fly” yenidən kodlaşdırma (streaming)
Fayl çox böyükdürsə, hətta aralıq fayl da yaratmaya bilərsiniz — məsələn, şəbəkədən gələn məlumatların axınla emalı zamanı “on-the-fly” oxuyub-yaza bilərsiniz.
5. Faylların yenidən kodlaşdırılmasında tipik səhvlər
Səhv №1: Yanlış ilkin kodlaşdırma. İlkin kodlaşdırmanı səhv seçsəniz, nəticə məyusedici olacaq: “Privet” "Привет"-ə çevriləcək. Həmişə faylın hansı kodlaşdırmada yaradıldığını dəqiqləşdirin.
Səhv №2: Sistemin standart kodlaşdırmasından qeyri-aşkar istifadə. Kodlaşdırmanı açıq göstərməsəniz, Java sistemin susmaya görə dəyərini istifadə edir (System.getProperty("file.encoding")). Bu, müxtəlif kompüterlərdə fərqli nəticələrə səbəb ola bilər (məsələn, Windows-da — cp1251, Linux-da — UTF‑8).
Səhv №3: Bütün faylı yaddaşa oxuma və yazma. Böyük fayllar üçün bu yanaşma yaddaşın dolmasına gətirib çıxaracaq. Sətir-sətir oxu və yazmadan istifadə edin.
Səhv №4: Emal olunmamış istisnalar. Fayllar mövcud olmaya, başqa proseslər tərəfindən məşğul ola və ya səhv simvollar ehtiva edə bilər. Həmişə istisnaları emal edin və ya try-with-resources-dən istifadə edin.
Səhv №5: İkili (binary) faylların yenidən kodlaşdırılması. Şəkilləri, PDF-ləri, arxivləri və digər ikili faylları yenidən kodlaşdırmağa çalışmayın! Bu, onların korlanmasına səbəb olacaq. Yenidən kodlaşdırma yalnız mətn faylları üçün məntiqlidir.
GO TO FULL VERSION