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.
Program çıktısı;
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ı;
Şimdi çıktıya bakalım
Evet gayet düzgün çalışıyor :)
Ö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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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ı;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
Yorum Gönder