Bilgisayarlar sadece rakamlardan anlarlar. Onlar için her işlem ve her data rakamlardan oluşur. Örneğin ilk masaüstü bilgisayarları bu eşleştirme için ASCII kodlamayı kullanırlar. Bunun için her bir harfin kod karşılığı bulunur. Mesela “H” 72 sayısı ile ifade edilir. Fakat IBM Mainframe’i bu kodlama için ASCII yerine EBCDIC kullanmaktadır. IBM Mainframe’inde “H” harfi 200 sayısı ile kodlanmaktadır. Bu nedenler özellikle Java gibi birçok ortamda çalışmayı planlayan bir dil için Karakter Setler önem kazanıyor.
Java Karakter Set sınıfları java.nio.charset paketi içerisinde bulunmaktadır. Bunlar Charset, CharsetEncoder ve CharsetDecoder sınıflarıdır.
Bu sınıflar sayesinde çeşitli karakter setleri arasında geçişleri yapabiliriz.
Java kendisi kodlama olarak Unicode kullanır. Unicode’dan başka bir kodlamaya geçiş için Encoder, herhangi bir kodlamadan Unicode’a geçiş için Decoder kullanılır.
// bu kod ile sistemimizin desteklediği Karakter Setleri görebiliriz. SortedMap map = Charset.availableCharsets();
Şimdi setler arası geçiş için bir örnek verelim.
import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; public class Convert { public static void main(String args[]) { // Sistemdeki setleri bastıralım System.out.println(Charset.availableCharsets()); // ASCII Karaketer Seti oluşturalım Charset asciiCharset = Charset.forName("US-ASCII"); CharsetDecoder decoder = asciiCharset.newDecoder(); // ASCII olarak JAVACI yazalım byte javaci[] = {74, 65, 86, 65, 67, 73}; // Bunu Byte Buffer içerisine koyalım ByteBuffer asciiBytes = ByteBuffer.wrap(javaci); CharBuffer javaciChars = null; try { // Unicode'a çevirelim javaciChars = decoder.decode(asciiBytes); } catch (CharacterCodingException e) { System.err.println("Error decoding"); System.exit(-1); } // Ekrana JAVACI basacaktır System.out.println(javaciChars); // Unicode'dan UTF-16LE kodlamaya çevirelim Charset utfCharset = Charset.forName("UTF-16LE"); CharsetEncoder encoder = utfCharset.newEncoder(); ByteBuffer utfBytes = null; try { utfBytes = encoder.encode(javaciChars); } catch (CharacterCodingException e) { System.err.println("Error encoding"); System.exit(-1); } byte newJavaci[] = utfBytes.array(); for (int i = 0, n = newJavaci.length; i < n; i++) { System.out.println(i + " :" + newJavaci[i]); } } }

September 14th, 2008 at 11:08 am
Merhaba Erol,
Code icin tesekkurler.
Sormak istedgim ISO-8859-1 le gelen turkce karakterler.
ornegin O (ustu iki nokta) harfi 195, 150 (bunlar A ustu cizgi ve Tire dir) olarak aliniyor.
yukaridaki code bu durumda kullanamadim.
cunku byte 127 sonrasi kabul etmiyor.
char olarak dizin olusturdum ama bu durumdada CharsetDecoder.decode
char[] kabul etmiyor.
Bunula ilgili bi calisma var aslinda. Link asagida
http://www.w3.org/International/O-URL-code.html
ama merak ettigim sey, Java nin bu sorun icin(ASCII olmayan karakterlerin UTF8 donusumu) sundugu bir library si yok mudur?
Ilgin icin tesekkurler,
Eger onerecegiz bir yontem varsa memnun olurum.
Saygilar,
Telman
September 15th, 2008 at 2:22 am
Merhaba,
Java kurulum klasörü içerisindeki bin klasöründe ($JAVA_HOME/bin) native2ascii.exe diye dosya bulabilirsin. Bu program ile Unicode olmayan karakterleri otomatik olarak Unicode’a çevirebilirsin.
Kullanımı;
native2ascii [options] [inputfile [outputfile]]
Soruna cevap bulabilmişimdir umarım…