Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/fontdata.js
Ana içeriğe atla

Java Process Çıktısı Türkçe Karakter Sorunu

Merhaba arkadaşlar. Bildiğiniz gibi Java'da bir process oluşturmak için ProcessBuilder sınıfından yararlanıyoruz. Oluşturduğumuz process eğer çıktı üretiyorsa bu çıktıyı okuyabiliyoruz. Ancak bu çıktı Türkçe karakter içeriyorsa, biz bu çıktıyı okuduğumuz zaman düzgün bir şekilde elde edemiyoruz. Daha doğrusu kodlama Türkçe'ye göre yapılmadığı için (ş,ç,ğ,ı,ü,ö) karakterleri farklı bir şekilde ekranda görüntüleniyor.

Öncelikle sorunu gözle görelim ve bunu çözmeye çalışalım. Aşağıda ping atmak üzere yazdığım bir program var. Ping atabilmek için bir process oluşturuyorum ve çıktıları ekrana yazıyorum. İşletim sistemimi Türkçe kullandığım için çıktı da Türkçe ifadeler geçiyor.
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
ProcessBuilder p = new ProcessBuilder();
p.command("cmd.exe", "/c", "ping -n 3 google.com");
try {
Process process = p.start();
BufferedReader cikti = new BufferedReader(new InputStreamReader(process.getInputStream()));
String satir;
while ((satir = cikti.readLine()) != null) {
System.out.println(satir);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
view raw 6.java hosted with ❤ by GitHub
Program çıktısı;
google.com [216.58.206.206] yoklan�yor32 bayt veri ile:
216.58.206.206 cevab�: bayt=32 s�re=44ms TTL=51
216.58.206.206 cevab�: bayt=32 s�re=45ms TTL=51
216.58.206.206 cevab�: bayt=32 s�re=45ms TTL=51
216.58.206.206 i�in Ping istatisti�i:
Paket: Giden = 3, Gelen = 3, Kaybolan = 0 (%0 kay�p),
Mili saniye t�r�nden yakla��k tur s�releri:
En Az = 44ms, En �ok = 45ms, Ortalama = 44ms

Görüldüğü gibi, Türkçe karakterler düzgün görüntülenmiyor. Bunu düzeltmenin bir yolu olmalı değil mi? O zaman bakalım.

Bu  sayfada bildirildiğine göre, konsol tabanlı dönüştürmeler için OEM kod sayfasında belirtilen kod numaraları kullanılıyor. Ve OEM kod sayfasına şuradan baktığımız zaman bizim için doğru karakter kodlamasının 857 olduğunu görüyoruz.

Bu kodun başına CP getirerek, Java kodumuzun içerisinde InputStreamReader ile okuma yaparken ikinci argüman olarak veriyoruz. Yani kodumuz bu şekilde olmalı;
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
ProcessBuilder p = new ProcessBuilder();
p.command("cmd.exe", "/c", "ping -n 3 google.com");
try {
Process process = p.start();
BufferedReader cikti = new BufferedReader(new InputStreamReader(process.getInputStream(),"CP857"));
String satir;
while ((satir = cikti.readLine()) != null) {
System.out.println(satir);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
view raw 7.java hosted with ❤ by GitHub
Şimdi çıktıya bakalım
google.com [216.58.206.206] yoklanıyor32 bayt veri ile:
216.58.206.206 cevabı: bayt=32 süre=45ms TTL=53
216.58.206.206 cevabı: bayt=32 süre=50ms TTL=53
216.58.206.206 cevabı: bayt=32 süre=47ms TTL=53
216.58.206.206 için Ping istatistiği:
Paket: Giden = 3, Gelen = 3, Kaybolan = 0 (%0 kayıp),
Mili saniye türünden yaklaşık tur süreleri:
En Az = 45ms, En Çok = 50ms, Ortalama = 47ms

Evet gayet düzgün çalışıyor :)

Yorumlar

Bu blogdaki popüler yayınlar

Python Subprocess

subprocess modülü, yeni bir process oluşturmayı sağlayan, bunların girdi-çıktılarını ele alma imkânı veren ve dönüş kodlarını almayı sağlayan bir modüldür. Yani daha basit bir şekilde, program içinde program çalıştırmaya imkan veren bir modüldür. Subprocess Modülünün Kullanımı subprocess basit bazı process'leri kullanmak için birkaç tane fonksiyon sunuyor. Daha karmaşık bir process çalıştırmak isterseniz, Popen sınıfını kullanabilirsiniz. Bunlara detaylı bir şekilde değinmeye çalışacağız. Şimdi basit fonksiyonları inceleyelim

Infix to postfix dönüşümü

Infix to postfix dönüşümü, operatorün ortada olduğu a+b yazım şeklini operatorün sonda olduğu ab+ yazım şekline dönüştürme işlemidir. Bu yazıda iki şekilde dönüşümden bahsedeceğim:   1) Stack yapısı kullanarak dönüştürme 2) Kağıt üstünde el ile dönüştürme    Infix gösterimi, bizler için kolay bir gösterim olsa da makineler için öyle değildir. İfadeyi okurken a + b * c işleminde önce b ile c yi çarpıp sonra da a ile toplamayı kolay bir şekilde yapabiliriz çünkü bizim ifadeyi sıra ile adım adım giderek okuma zorunluluğumuz yok. Önce b*c nin öncelikle olduğunu görerek oradan başlar, sonra a ile kolayca toplarız.

Python Soket Programlama

Merhaba arkadaşlar. Bugün sizlerle birlikte Python'da socket programlama yapacağız. Bunun için Python da socket kütüphanesini kullanacağız. Peki nedir bu socket programlama? Soket programlama, sizin iki program arası yada iki bilgisayar arası iletişim kurmanızı sağlar. İşte bizde bugün iki programımızı birbiri ile haberleştireceğiz. Bunun için elimizde iki program olacak. Birinci program,mesaj bekleyen program olacak, diğeri ise mesaj gönderen program.