UTF-8 Nedir
UTF-8 metini byte dizisine çevirirken kullanılan bir encoding.
Mutibyte Ozelliği
Açıklaması şöyle. UTF8 karakteri 1 veya 4 byte olabilir.
- Eğer bir byte ise 0 ile başar.
- İki byte ise 110 ile başlar.İkinci byte 10 ile başlar.
- Üç byte ise 1110 ile başlar. Diğer byte'lar 10 ile başlar.
- Dört byte ise 11110 ile başlar. Diğer byte'lar 10 ile başlar.
Yani Unicode tablosunu 4 düzleme ayırıyor. ASCII karakterlerini içeren ilk düzlemi (0x7F yani 127) bir byte ile temsil eder. Diğer karakterleri ise birkaç byte ile temsil eder.
Tablo şöyle
En Son Kullanılabilen Unicode Değeri
UTF-8 en fazla 0x10FFFF değerini alabildiği için 1,112,064 tane kod noktasını temsil edebilir.
Yani 1,114,111 tane Unicode kod noktasının tamamını temsil edemiyor.
Ama zaten gerek te yok çünkü şu anda sadece 120,737 tane Unicode kod noktası kullanımda.
Karakterleri Saymak
UTF-8 ile dokümandaki bir karaktere atlamak veya karakterleri saymak problem olabilir. Açıklaması şöyle
UTF-8 ile encode edilmiş bir byte'ın en önemli iki biti (MSB bitleri) 0,110,1110,11110 veya 10 ile başlayabilir.
110,1110,11110 ile başlıyorsa bu çoklu bir byte dizisinin başlangıcını belirtir.
10 ile başlıyorsa çoklu byte dizisinin devamını belirtir.
Dolayısıyla byte'lara bakarak UTF-8 ile encode edilmiş bir byte array'deki karakterleri saymak için aşağıdaki kod kullanılabilir.
UTF-8 Karakterleri Gösterememek
UTF-8 karakterler gösterilemezse yerlerine kalp, kutucuk, soru işareti gibi karakterler gelir.
UTF-8 metini byte dizisine çevirirken kullanılan bir encoding.
Mutibyte Ozelliği
Açıklaması şöyle. UTF8 karakteri 1 veya 4 byte olabilir.
- Eğer bir byte ise 0 ile başar.
- İki byte ise 110 ile başlar.İkinci byte 10 ile başlar.
- Üç byte ise 1110 ile başlar. Diğer byte'lar 10 ile başlar.
- Dört byte ise 11110 ile başlar. Diğer byte'lar 10 ile başlar.
A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules:Unicode Düzlemlere Ayrılır
For 1-byte character, the first bit is a 0, followed by its unicode code.
For n-bytes character, the first n-bits are all one's, the n+1 bit is 0, followed by n-1 bytes with most significant 2 bits being 10.
Yani Unicode tablosunu 4 düzleme ayırıyor. ASCII karakterlerini içeren ilk düzlemi (0x7F yani 127) bir byte ile temsil eder. Diğer karakterleri ise birkaç byte ile temsil eder.
Tablo şöyle
First code Last code Bytes Byte 1 Byte 2 Byte 3 Byte 4 point point Used U+0000 U+007F 1 0xxxxxxx U+0080 U+07FF 2 110xxxxx 10xxxxxx U+0800 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx U+10000 U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx x means that this bit is used to select the code point.UTF-8 Google Protocol Buffers'taki Variable Length Encoding kullanan Varint'i andırıyor.
En Son Kullanılabilen Unicode Değeri
UTF-8 en fazla 0x10FFFF değerini alabildiği için 1,112,064 tane kod noktasını temsil edebilir.
Yani 1,114,111 tane Unicode kod noktasının tamamını temsil edemiyor.
Ama zaten gerek te yok çünkü şu anda sadece 120,737 tane Unicode kod noktası kullanımda.
Karakterleri Saymak
UTF-8 ile dokümandaki bir karaktere atlamak veya karakterleri saymak problem olabilir. Açıklaması şöyle
UTF-8 uses a variable number of bytes per character. This saves a lot of space if your text is ASCII plus the occasional emoji or accented letter. But a drawback of variable-length encoding is that jumping to an arbitrary position scales linearly with the size of the document. A fixed width encoding like UTF-32 would use more space but jumping to a position in the document is constant time. Depending on the size of the document and speed of the medium you're reading it from, linear time seeking vs. constant time seeking could make a huge difference in the performance of your application.Örnek
UTF-8 ile encode edilmiş bir byte'ın en önemli iki biti (MSB bitleri) 0,110,1110,11110 veya 10 ile başlayabilir.
110,1110,11110 ile başlıyorsa bu çoklu bir byte dizisinin başlangıcını belirtir.
10 ile başlıyorsa çoklu byte dizisinin devamını belirtir.
Dolayısıyla byte'lara bakarak UTF-8 ile encode edilmiş bir byte array'deki karakterleri saymak için aşağıdaki kod kullanılabilir.
int CalcUTF8Chars( const std::string& S )
{
int Count = 0;
for ( size_t i = 0; i != S.length(); i++ )
{
if ( ( S[i] & 0xC0 ) != 0x80 ) { Count++; }
}
return Count;
}
Benzer bir C kodu şöyledir.int strlen_utf8(char *s)
{
int i = 0, j = 0;
while (s[i])
{
if ((s[i] & 0xc0) != 0x80) j++;
i++;
}
return j;
}
Bu kod byte 11 ile başlıyorsa bu byte'ı bir karakter olarak sayar, 10 ile başlıyorsa es geçer. Bir byte'ın 11 ile başladığını anlamak için 0XC0 kullanılır. Bu sayı bit olarak 11 00 00 00'a denk gelir. Yani ilk iki biti 11 ile mask'landıktan sonra sonuç 0X80 (10 00 00 00) değil ise karakter başlangıcı olduğu için sayaç artırılır.UTF-8 Karakterleri Gösterememek
UTF-8 karakterler gösterilemezse yerlerine kalp, kutucuk, soru işareti gibi karakterler gelir.
Hiç yorum yok:
Yorum Gönder