Merhaba sevgili yazılımperver dostlarım,
C++ 17 ile gelen yeniliklere bakmaya devam ediyoruz. Aslına bakarsanız öne çıkan kabiliyetlerin bir çoğunun üzerinden geçtiğimizi görüyorum. Bu yazımda da, C++ 17 ile gelen ve bahsetmediğim kabiliyetlerden birine değineceğim.
Bu kabiliyet u8 karakter tanımlamaları (character literal).
C++ 11 ile birlike u8 ön tanımlaması ile UTF-8 metinler tanımlanabilmekteydi (Ör. std::string msg = u8″महसुस”;), fakat karakter olarak tanımlı değildi (sadeceü u’ ‘, U’ ‘ ve L’ ‘ vardı). C++ 17 ile birlikte artık (u8’ ‘) da mümkün olabilecek.
Aşağıdaki kod parçasında, bu karakter değişmezlerinin kullanımına ilişkin örneği görebilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> #include <cstdint> #include <iomanip> #include <iostream> #include <string_view> using namespace std; // Detaylar için https://en.cppreference.com/w/cpp/language/character_literal goz atabilirsiniz template <typename CharT> void dump(std::string_view s, const CharT c) { const uint8_t* data {reinterpret_cast<const uint8_t*>(&c)}; cout << s << " \t" << std::hex << uppercase << setfill('0'); for (auto i {0U}; i != sizeof(CharT); ++i){ cout << setw(2) << static_cast<unsigned>(data[i]) << ' '; } cout << '\n'; } int main() { cout <<"ASCII : "; dump("'a'", 'a'); cout <<"UTF8 : "; dump("u8'a'", u8'a'); cout <<"UTF16 : "; dump("u'a'", u'a'); cout <<"UTF32 : "; dump("U'a'", U'a'); return 0; } |
Bu kod parçasının çıktısı da aşağıdaki gibi olmaktadır:
1 2 3 4 |
ASCII : 'a' 61 UTF8 : u8'a' 61 UTF16 : u'a' 61 00 UTF32 : U'a' 61 00 00 00 |
Öncelikle, bu kabiliyeti daha iyi anlayabilmek adına ASCII ve UTF-8 arasındaki farklara, daha doğrusu “encoding”‘e, karakter kodlamasına, vakıf olmakta fayda var.
İnternet üzerinde, bunu bende çok daha iyi anlatan kaynaklar olmakla birlikte, burada kısaca bir değinmekte fayda var.
ASCII, karakterleri ifade etmek üzere 7 bit kullanmaktadır (https://www.ascii-code.com/), bir diğer ifade ile, karakterleri 128 farklı değere eşlemektedir. Bu da genelde İngilizce kullanılan durumlarda sıkıntı yaratmasa da, Türkçe veya farklı dil ve semboller için sorun olabilmekte. Burada akıllara şu soru da gelebilir, e kalan 128 sayısal değer ne oluyor? O işte genişletilmiş ASCII olarak geçmekte ve genelde farklı değerlendirilebilmektedir.
Peki bunu nasıl çözüyoruz. Unicode işte tam olarak bu tarz farklılıkları ortan kaldırmak üzere ortaya konulmuştur. Bu da aslında, bit bit karakterleri ifade etmek yerine, jenerik bir sistem ortaya koymaya dayanıyor. Burada, UTF-8 (Unicode Tranformation Format)’a bakıyor olacağız (buna benzer şekilde UTF-1, UTF-7, UTF-16, vb. de bulunmaktadır). UTF-8, ASCII ile de uyumlu olabilmesi adına (yukarıdaki ilk iki satır), ASCII sistemler ile haberleşirken aynı değerler kullanılmakta. Bir diğer ifade ile İngilizce karakterler için, ASCII ile aynı değerlerle kullanılabilmekte. Diğer dillere ilişkin karakterleri ifade etmek için, değişken boyutlu bir yaklaşım kullanılmakta ve UTF-8 ile 1 byte’tan 4 byte’a kadar uzunluk ile bu karakterler ifade edilebilmektedir. Neyse konuyu daha fazla uzatmayayım 🙂 Aslında buna ayrı bir yazı yazmak daha iyi olur.
Bu arada UTF-8 karakter listesi içi https://www.fileformat.info/info/charset/UTF-8/list.htm sayfasına göz atabilirsiniz.
Bu konuda başvurulacak olan ilk kaynak Joel On Software sayfasıdır. Eğer henüz bakmadıysanız muhakkak bu sayfayı bir kere okumalısınız! Ayrıca kaynaklar kısmına eklediğim video da, bu konuyu güzel bir şekilde özetliyor 😉
Bir sonraki yazımda görüşmek dileğiyle, hepinize mutlu günler diliyorum.
Kaynaklar
- https://www.ascii-code.com/
- https://home.unicode.org/
- https://www.youtube.com/watch?v=MijmeoH9LT4
- https://www.fileformat.info/info/charset/UTF-8/list.htm
- https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/