Tüm makaleler

Text Reverse: "metni tersine çevirmek" neden göründüğünden zor

Türkçede "anna" veya "oto" gibi kısa palindromlar tersten okunduğunda da aynı kalır, ve Latin alfabesine dayanan Türkçe metinleri tek tek karakter bazında ters çevirmek genelde sorunsuz çalışır. Asıl sorun, işin koda döküldüğü satırda değil, metnin nasıl kodlandığı katmanında ortaya çıkar.

Kod noktası mı, bayt mı

ç, ğ, ı, ö, ş, ü gibi Türkçeye özgü harfler UTF-8'de birden fazla bayt kaplar. Bir dizeyi Unicode kod noktaları yerine ham bayt dizisi üzerinden ters çeviren saf bir uygulama, çok baytlı bir karakteri kendi baytlarına böler ve onları ayrı ayrı ters çevirir. Sonuç geçersiz bir bayt dizisidir ve ekranda karakterin doğru yere taşınması yerine gibi bozuk bir sembol olarak görünür.

Grafem kümesi nedir

İnsanın "tek bir görünür karakter" olarak algıladığı şey, Unicode'da bazen birden fazla kod noktasından oluşur — örneğin bir aile emojisi (👨‍👩‍👧) aslında sıfır genişlikli birleştirici karakterle (zero-width joiner) birbirine bağlanmış birkaç ayrı emojidir. Böyle bir birleşime grafem kümesi denir.

Saf ters çevirme neden her şeyi bozar

Bir dize grafem kümeleri yerine tek tek kod noktalarına göre ters çevrilirse, birleştirici karakter yanlış yere düşer ve tek bir görünür emoji yerine birbiriyle ilgisiz, ayrı karakterlerden oluşan bir küme ortaya çıkar. Türkçe metin emoji veya başka birleştirici karakterlerle bir arada kullanıldığında bu durum gerçek bir sorun hâline gelir.

Doğru ters çevirme

Doğru bir uygulama, önce dizeyi kod noktaları düzeyinde işler (bayt düzeyinde değil), ardından birleştiriciler ve değiştiriciler dikkate alınarak grafem kümelerine böler ve yalnızca bu kümelerin sırasını değiştirir.

Ne işe yarar

  • Palindrom kontrolü yapmak veya "ayna" metin efekti oluşturmak.
  • Koddaki bir Unicode işleme hatasını göstermek veya teşhis etmek.
  • Emoji içeren metinlerin doğru şekilde ters çevrilmesini gerektiren eğlence veya eğitim amaçlı görevler.
Aracı dene