[Çözüldü] Java Türkçe Karakter Algılamıyor

Başlatan afeser, 27 Temmuz 2016 - 15:52:49

« önceki - sonraki »

0 Üyeler ve 4 Ziyaretçi konuyu incelemekte.

afeser

Merhabalar, java ile şifreleme programı yapmaya çalışıyorum. Önce byte dizisi olarak şifreleme yapıp sonra çözüyorum. Normalde herhangi bir sorun yok, byte değerini belirlediğimde aynı değeri geri alıyorum ama mesela "ç" karakterini yazdığım zaman 2 byte oluşuyor. -61,-89 sanırım.

String s="aça";
byte[] b=s.getBytes();
for(int i=0;i<s.length;i++){
    System.out.println(b[i]);
}
System.out.println(s);

Böyle yazdığımda herhangi bir sorun yok önce byte'ları sonra string'i yazıyor. Ama string'i parçalayıp sonra tekrar birleştirince bu sefer "ç" yerine garip garip karakterler çıkıyor. Integer değeri aynı olmasına rağmen program sanki 2 farklı karaktermiş gibi okuyor.

...
     b[i]=decryptByte(encryptedByte[i]);
...

Kodlar tam olarak aklımda değil ama çalışma mantığı bu. Tek tek byte ayırıp sonra birleştiriyorum. Direk string yazdırsam türkçe karakter okuyor ancak birleştirilmiş dizi olunca 2 farklı tam sayı değeri olduğundan 2 farklı karakter yazıyor.

Acaba String s1="sucuk"; ve String s2="sucuk"; string'leri arasında bilgisayar açısından bir fark mı var? Ben ikisini de aynı olarak düşünüyordum. Bilgisayarın alfabe algılamasını sağlayan bilgi nerede depo ediliyor?
Bu bilgiyi nasıl değiştirebilirim?
Teşekkürler...

Düzenleme1

Mesela;

String s="ç";
System.out.println(s.getBytes()[0]+s.getBytes()[1]);


Çıktı olarak şunu versin:
-61
-89


String s=(char)(-61);
s+=(char)(-89);
System.out.println(s);


Bu kod çıktı olarak "ç" vermiyor. Onun yerine -61 ve -89 değerine sahip 2 karater yazıyor.

Umarım anlatabilmişimdir...
Gelecek illa ki gelecek, önemli olan kimin getirdiği...

harun252525

sorunu yanlış anlamadıysam hangi karakterin kaç byte olduğunun hiç bir önemi yok. siz zaten tüm byteleri eski haline çevirdiğinizde hepsi yine aynı olacaktır.
Kod Yazmak Bir Şiirdir.

afeser

Alıntı yapılan: harun252525 - 27 Temmuz 2016 - 16:48:57
sorunu yanlış anlamadıysam hangi karakterin kaç byte olduğunun hiç bir önemi yok. siz zaten tüm byteleri eski haline çevirdiğinizde hepsi yine aynı olacaktır.

Sorun orada zaten ben char olarak eklediğim için çıktı değişiyor.

Şirin şarkikaraağaç

Ben  bunu yazıyorum ama çıktı:

ᅤ゙irin ᅤ゚arkikaraaᅣ゚aᅢᄃ

bu şekilde oluyor. Eğer doğru 2 byte yan yana gelirse zaten doğru karakteri üretmez mi?
Gelecek illa ki gelecek, önemli olan kimin getirdiği...

bugra9

Alıntı YapEğer doğru 2 byte yan yana gelirse zaten doğru karakteri üretmez mi?
Üretmez. Ama şu şekilde sorarsan; "2 byte yan yana geldiğinde ve doğru şekilde yorumlandığında doğru karakteri üretmez mi?" cevap üretilir olacaktır. Demek istediğim başta aldığın dosyanın/yazının karakter seti neyse şifreleme/açma işleminden sonra yorumlatırken de aynı karakter setiyle bunu yapman lazım. Byte dizileri tek başlarına anlam ifade etmezler.

Elinde byte dizisi olduğunu düşün. Eğer bir karakterin 2 byte dan oluştuğu durum varsa karakter seti "utf-8" olmalı. Bu diziyi ekrana aşağıdaki gibi basabilirsin.

System.out.println(new String(b, StandardCharsets.UTF_8));

harun252525

Alıntı Yap
Çıktı olarak şunu versin:
-61
-89

Kod: [Seç]
String s=(char)(-61);
s+=(char)(-89);
System.out.println(s);

Bu kod çıktı olarak "ç" vermiyor. Onun yerine -61 ve -89 değerine sahip 2 karater yazıyor.

Umarım anlatabilmişimdir...

burada bu hatanın sebebi açık ç vermemesi gayet normal. neden diye soracak olursanız -61 ve -89 karakterlerini birleştirmeniz o tür karakterlere denk gelen iki karakteri birleşirmeniz anlamına gelir eğer şöyle birşey yapabiliyorsanız sanırım sorun çözülebilir. şimdi "ç" karakteri utf-8 formatında 2 byte kaplayan bir karakterdir siz boyutu 2 byte olan bir string yapıp dikkat edin 2 karakter demedim 2 byte dedim burası çok önemli işte bu stringi yapıp 1. byte sine -61 ve 2. byte sine de -89 bytelerini byte formatına dönüştürerek kopyalayıp öyle deneyin muhtemelen sorun çozülür.
Kod Yazmak Bir Şiirdir.

Amenofis

Karakter formatına dikkat et. Hangi formatta encode ettiysen yine o formatta decode etmen gerekir.

Ayrıca javadaki char türü 2 byte tır. Sen -61'i char'a dönüştürdüğün zaman 0xFFC3 sayısına dönüşür. O yüzden char yerine byte dizisi ve String nesnesiyle çalışmanı öneririm.

afeser

Herkese çok teşekkür ederim. char hiç kullanmadan direk byte üzerinden işlemi yapıp karakter formatını ayarlayınca çalıştı.
Gelecek illa ki gelecek, önemli olan kimin getirdiği...