Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] Buffer ile Encoding Dönüşümleri
Karakter kodlaması (encoding), bilgisayar dünyasının en eski ve en karmaşık konularından biridir. Farklı sistemler farklı kodlamalar kullanır ve bu kodlamalar arasında dönüşüm yapmak sık karşılaşılan bir ihtiyaçtır. Ben bir kez Türkiye'deki bir bankanın eski sistemlerinden gelen verileri işlemem gerektiğinde, ISO-8859-9 kodlamasındaki verileri UTF-8'e dönüştürmek için saatlerce uğraştığımı hatırlıyorum. O deneyimden sonra encoding konusunu derinlemesine öğrenmeye karar verdim.
Node.js'in Buffer sınıfı, birkaç yaygın kodlamayı dahili olarak destekler: utf-8, ascii, base64, base64url, hex, binary (latin1) ve utf16le. Bu kodlamalar arasında dönüşüm yapmak Buffer.from() ve toString() metodlarıyla oldukça kolaydır. Ancak ISO-8859-9 (Türkçe), Windows-1254, EUC-KR gibi daha az yaygın kodlamalar için harici kütüphanelere ihtiyaç duyarsınız.
UTF-8, günümüzde en yaygın kullanılan kodlamadır ve Node.js'in varsayılan kodlamasıdır. UTF-8'in güzel yanı, ASCII karakterleri tek byte ile temsil ederken Türkçe karakterler gibi Latin harfleri dışındaki karakterleri iki veya daha fazla byte ile temsil etmesidir. Bu, İngilizce metinlerde alan tasarrufu sağlarken uluslararası karakterleri de sorunsuz destekler.
Base64 kodlaması, binary veriyi metin olarak temsil etmek için kullanılır. E-posta ekleri, veri URI'leri, JWT token'ları ve API iletişiminde sıklıkla karşılaşırsınız. Base64, her 3 byte'ı 4 karakterle temsil eder, bu da veri boyutunu yaklaşık yüzde 33 artırır. Ancak bu artış, binary verinin güvenli bir şekilde metin kanallarından geçirilmesini sağlar.
Hex kodlaması ise her byte'ı iki hexadecimal karakterle temsil eder. Kriptografik hash'ler, MAC adresleri ve düşük seviye hata ayıklama işlemlerinde hex kodlaması tercih edilir. Veri boyutunu iki katına çıkarır ama okunabilirlik açısından avantaj sağlar.
Pratikte encoding sorunları genellikle farklı sistemler arası veri aktarımında ortaya çıkar. Bir dosya Windows ortamında Windows-1254 kodlamasıyla oluşturulmuş olabilir ve siz bunu Linux sunucunuzda UTF-8 olarak okumaya çalıştığınızda Türkçe karakterler bozulur. Bu sorunu çözmek için önce dosyanın gerçek kodlamasını tespit etmeniz, ardından uygun dönüşümü yapmanız gerekir.
Encoding tespiti tam olarak güvenilir bir işlem değildir. Chardet veya jschardet gibi kütüphaneler istatistiksel yöntemlerle kodlamayı tahmin edebilir ama yüzde yüz doğruluk garantisi vermezler. En güvenilir yöntem, verinin kaynağından kodlama bilgisini almaktır. HTTP yanıtlarında Content-Type başlığı, XML dosyalarında encoding bildirimi ve veritabanı bağlantılarında karakter seti ayarı bu amaçla kullanılır.
Bir diğer önemli konu BOM (Byte Order Mark) işaretçisidir. UTF-8 BOM'u dosyanın başındaki üç byte'tır (0xEF, 0xBB, 0xBF). Bazı Windows uygulamaları dosyaları BOM ile kaydeder. Bu BOM'u temizlemezseniz veri işleme sırasında beklenmedik sorunlarla karşılaşabilirsiniz.
JavaScript:
const { Buffer } = require('buffer');
// ===== TEMEL ENCODİNG DÖNÜŞÜMLERİ =====
const turkceMetin = 'Merhaba! Türkçe özel karakterler: şçğüöıİŞÇĞÜÖ';
// UTF-8 kodlama (varsayılan)
const utf8Buffer = Buffer.from(turkceMetin, 'utf-8');
console.log('UTF-8 byte uzunluğu:', utf8Buffer.length);
console.log('Karakter uzunluğu:', turkceMetin.length);
console.log('UTF-8 hex:', utf8Buffer.toString('hex').substring(0, 40) + '...');
// Base64 kodlama
const base64Metin = utf8Buffer.toString('base64');
console.log('Base64:', base64Metin);
// Base64'ten geri dönüşüm
const geriDonus = Buffer.from(base64Metin, 'base64').toString('utf-8');
console.log('Geri dönüşüm:', geriDonus);
console.log('Eşleşme:', turkceMetin === geriDonus); // true
// Base64URL kodlama (URL güvenli versiyon)
const base64url = utf8Buffer.toString('base64url');
console.log('Base64URL:', base64url);
// Hex kodlama
const hexMetin = utf8Buffer.toString('hex');
console.log('Hex:', hexMetin.substring(0, 40) + '...');
const hexGeri = Buffer.from(hexMetin, 'hex').toString('utf-8');
console.log('Hex geri dönüşüm doğru:', hexGeri === turkceMetin);
// ===== FARKLI ENCODİNG KARŞILAŞTIRMASI =====
function kodlamaBoyutKarsilastir(metin) {
const kodlamalar = ['utf-8', 'ascii', 'latin1', 'base64', 'hex', 'utf16le'];
console.log('
--- Kodlama Boyut Karşılaştırması ---');
console.log('Orijinal metin: "' + metin + '"');
console.log('Karakter sayısı: ' + metin.length);
kodlamalar.forEach(kodlama => {
try {
const buf = Buffer.from(metin, kodlama === 'base64' || kodlama === 'hex' ? 'utf-8' : kodlama);
const boyut = buf.length;
const geriMetin = buf.toString(kodlama === 'base64' || kodlama === 'hex' ? 'utf-8' : kodlama);
const kayipVar = geriMetin !== metin;
console.log(
' ' + kodlama.padEnd(10) +
': ' + boyut + ' byte' +
(kayipVar ? ' [KARAKTER KAYBI VAR!]' : ' [tamam]')
);
} catch (hata) {
console.log(' ' + kodlama.padEnd(10) + ': HATA - ' + hata.message);
}
});
}
kodlamaBoyutKarsilastir('Türkçe şçğüöı test');
// ===== BOM (Byte Order Mark) İŞLEMLERİ =====
// UTF-8 BOM tespiti ve temizleme
function bomTemizle(buffer) {
// UTF-8 BOM: EF BB BF
if (buffer.length >= 3 &&
buffer[0] === 0xEF &&
buffer[1] === 0xBB &&
buffer[2] === 0xBF) {
console.log('UTF-8 BOM tespit edildi, temizleniyor...');
return buffer.slice(3);
}
// UTF-16 LE BOM: FF FE
if (buffer.length >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {
console.log('UTF-16 LE BOM tespit edildi');
return buffer.slice(2);
}
// UTF-16 BE BOM: FE FF
if (buffer.length >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) {
console.log('UTF-16 BE BOM tespit edildi');
return buffer.slice(2);
}
console.log('BOM bulunamadı');
return buffer;
}
// BOM ekleme
function bomEkle(buffer, tip = 'utf-8') {
const bomlar = {
'utf-8': Buffer.from([0xEF, 0xBB, 0xBF]),
'utf-16le': Buffer.from([0xFF, 0xFE]),
'utf-16be': Buffer.from([0xFE, 0xFF])
};
const bom = bomlar[tip];
if (!bom) throw new Error('Bilinmeyen BOM tipi: ' + tip);
return Buffer.concat([bom, buffer]);
}
// BOM test
const bomluVeri = bomEkle(Buffer.from('Test verisi', 'utf-8'), 'utf-8');
console.log('
BOM eklenmiş:', bomluVeri.toString('hex').substring(0, 20));
const temizVeri = bomTemizle(bomluVeri);
console.log('Temizlenmiş metin:', temizVeri.toString('utf-8'));
// ===== VERİ TİPİ DÖNÜŞÜMLERİ =====
// Sayı dizisinden buffer ve geri
const sayilar = [192, 168, 1, 100];
const ipBuffer = Buffer.from(sayilar);
console.log('
IP Buffer:', ipBuffer);
console.log('IP String:', Array.from(ipBuffer).join('.'));
// UTF-16LE dönüşümü (Windows uyumluluğu)
const windowsMetin = 'Türkçe';
const utf16Buffer = Buffer.from(windowsMetin, 'utf16le');
console.log('UTF-16LE boyut:', utf16Buffer.length, 'byte');
console.log('UTF-16LE geri:', utf16Buffer.toString('utf16le'));
// Dosya okuma ve encoding dönüştürme simülasyonu
function encodingDonustur(kaynakBuffer, kaynakKodlama, hedefKodlama) {
// Kaynak kodlamadan string'e çevir
const metin = kaynakBuffer.toString(kaynakKodlama);
// Hedef kodlamaya çevir
const hedefBuffer = Buffer.from(metin, hedefKodlama);
console.log(kaynakKodlama + ' → ' + hedefKodlama + ': ' +
kaynakBuffer.length + ' byte → ' + hedefBuffer.length + ' byte');
return hedefBuffer;
}
const ornekVeri = Buffer.from('Encoding dönüşüm testi', 'utf-8');
encodingDonustur(ornekVeri, 'utf-8', 'utf16le');
encodingDonustur(ornekVeri, 'utf-8', 'latin1');
Encoding dönüşümleri, farklı sistemler arasında veri taşırken karşılaşılan en yaygın sorunlardan biridir. Buffer sınıfının sunduğu dahili kodlama desteğini iyi anlamak ve BOM gibi gizli tuzaklara karşı hazırlıklı olmak, sağlam ve güvenilir uygulamalar geliştirmenizi sağlar. Özellikle Türkçe karakter içeren verilerle çalışırken UTF-8 kullanımını standart hale getirmenizi öneririm.
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 8
- Görüntüleme
- 3K
- Cevaplar
- 7
- Görüntüleme
- 1K
