Java Puzzle 14 – Default Charset

Merhaba Arkadaslar

Ornegimizi hemen inceleyelim;

CharsetExample.java

package _14.default$.charset;

public class CharsetExample {
	public static void main(String args[]) {
		byte bytes[] = new byte[256];
		for (int i = 0; i < 256; i++)
			bytes[i] = (byte) i;
		String str = new String(bytes);
		for (int i = 0, n = str.length(); i < n; i++)
			System.out.print((int) str.charAt(i) + " ");

	}
}

[0,256) araliginda dongumuzu donduruyoruz ve bytes dizisinin elemanlarina assign ediyoruz
for dongusu tamamlandiginda su sekilde bir assignment yapilmis olacak;
byte[0]=0;
byte[1]=1;
byte[2]=2;

byte[255]=255;
Sonrasinda bu byte[] array’i String constructor’a veriyoruz.

public String(byte bytes[]) {
this(bytes, 0, bytes.length);
}

Sonrasinda for dongusunde char degerleri (charAt(i)) , int e cast ediyoruz.
Burada negatif degerler kullanmadik , char unsigned oldugu icin zaten herhangi bir problem teskil etmeyecek.
Ornegi calistirdigimizda 0 dan 255 e kadar degerleri yazacak olarak dusunebiliriz.
Hayir, bu sekilde bir cikti olacaginin garantisi yoktur! Bunun nedeni public String(byte bytes[]) constructor’idir.

Specification der ki;
“Constructs a new String by decoding the specified byte array using the platform’s default charset. The length of the new String is a function of the charset, and hence may not be equal to the length of the byte array. The behavior of this constructor when the given bytes are not valid in the default charset is unspecified”
Ozet olarak diyor ki ; String objesi, byte array kullanilarak olusturuldugunda/construct mevcut makinanin/ortamin/platform’un varsayilan/default charset/karakter seti kullanilir.

Eger bu kodu Windows ortaminda yazarsaniz , Eclipse proje icin default Text file encoding Cp1254 olacaktir.
Bu durumda ciktimizin farkli olmasina neden olacaktir.

Linux ortaminda ve Tex File encoding UTF-8 suan ben de;

0 1 2 3 4 5 6 7 8 9 10... 125 126 127 65533 65533 65533 ... 65533

127 ye kadar bekledigimiz gibi calismakta sonrasinda 65533 yazmaktadir.

charset , kullanabilecegimiz karakter kumesini ifade eder.
encoding , karakterlerin hafizada saklanma yonetimini ifade eder.

Ornegin Unicode bir charset ‘tir(character set) , UTF-8 ise Unicode karakterleri icin kullanilan bir encoding turudur.
Benzer sekilde UTF-16 da Unicode karakterleri icin kullanilan bir baska encoding turudur.
Yani bir charset birden fazla encoding ile ifade edilebilir.
Bir baska ornek olarak ASCII (American Standard Code for Information Interchange) bir charset’tir.

Bekledigimiz gibi ciktiyi sadece ISO-8859-1 ile elde edebiliriz.

ISO-8859-1

ISO-8859-1 was incorporated as the first 256 code points of ISO/IEC 10646 and Unicode.

WithCharsetName.java

package _14.default$.charset;

import java.io.UnsupportedEncodingException;

public class WithCharsetName {
	public static void main(String args[]) throws UnsupportedEncodingException {
		byte bytes[] = new byte[256];
		for (int i = 0; i < 256; i++)
			bytes[i] = (byte) i;
		String str = new String(bytes,"ISO-8859-1");
		for (int i = 0, n = str.length(); i < n; i++)
			System.out.print((int) str.charAt(i) + " ");

	}
}

Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *