Java Thread Pool GMail ile mail göndermek
Sep 15

UnicodeBilgisayarlar 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]);
        }
    }
}

yazan Erol KOCAMAN

2 Yorum yapıldı “Karakter Setleri”

  1. telman diyor ki:

    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

  2. Erol KOCAMAN diyor ki:

    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…

Cevapla