Unicode etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Unicode etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

17 Mayıs 2023 Çarşamba

Unicode Düzlemleri (Plane) - Basic Multilingual Plane (BMP)

Giriş
Bu düzlem ilk Unicode standardından beri var. Daha sonra Unicode yetersiz kalınca diğer düzlemler de eklenmiş. İlk 65 bin küsur karaktere denk gelir. Açıklaması şöyle
The Basic Multilingual Plane (BMP) is the first and most commonly used 65,536 code points of Unicode, covering the codes of the characters for nearly all modern writing even across languages, from English to Mandarin and Hindi.
Açıklaması şöyle
The Unicode Standard has since been changed to allow for characters whose representation requires more than 16 bits. The range of Unicode code points is now U+0000 to U+10FFFF. The set of characters from U+0000 to U+FFFF is called the basic multilingual plane (BMP), and characters whose code points are greater than U+FFFF are called supplementary characters. Such characters are generally rare, but some are used, for example, as part of Chinese and Japanese personal names. To support supplementary characters without changing the char primitive data type and causing incompatibility with previous Java programs, supplementary characters are defined by a pair of Unicode code units called surrogates. 
Unicode karakterlerin sayısal değerlerinin ilk 7 biti Group, sonraki 8 biti Plane, sonraki 8 biti Row, en son 8 biti Cell olarak gruplanır. İlk Plane (group = 0, plane = 0) Basic Multilingual Plane (BMP) olarak adlandırılır. En çok kullanılan karakterler Basic Multilingual Plane alanına düşerler.

Basic Multilingual Plane kendi içinde alt bloklardan oluşuyor. Bir karakterin hangi blokta oluğunu öğrenmek için Java'da Character.UnicodeBlock.of (char) metodu kullanılabilir.

Türkçedeki her karakter aynı Unicode bloğuna ait değil. Çoğunluk BASIC_LATIN bloğunda olmasına rağmen bazı karakterler LATIN1_SUPPLEMENT  ve
LATIN_EXTENDED_A bloklarındalar.

2.1 BMP Basic Latin Block
BASIC_LATIN bloğundaki tüm karakterler UTF-8 encoding ile 1 byte yer kaplıyorlar. Yani bu block 0-127 arasındaki ASCII bloğu ile aynı.

2.2 BMP Latin-1 Supplement
Latin-1 Supplement 128'den 255'e kadar olan karakterleri içerir. Bu blok batı Avrupa dillerindeki karakterleri içindir. Basic Latin'den farklı olarak her karakter 8 bit uzunluğundadır. Bu block ISO-8859-1 ile aynı. ISO-8859-1 çok yeni bir standart değil. Örneğin Euro karakteri bu kodekte yok. ISO-8859-15 gibi daha yeni karakterleri içeren kodekler var.  Türkçe ISO-8859-9 kodekini kullanıyor.

CP1252'de Latin-1 gibi. Açıklaması şöyle
CP1252 is not a multibyte character set. It is a Windows variant of the Latin-1 or ISO-8859-1 character set.
İlginç Latin-1 Karakterleri
Acute Accent Karakteri
´ şeklinde gösterilir.
Name          Code point  Script  Block               UTF-8
GRAVE ACCENT  U+000060    Common  Basic Latin         60
ACUTE ACCENT  U+0000B4    Common  Latin 1 Supplement  C2 B4
Micro Karakteri
µ şeklinde gösterilir.

Diğer Karakterler
Aşağıdaki tabloda BASIC_LATIN bloğunda olmayan karakterler görülebilir.
Küçük "ı" ve büyük "I" harfleri farklı bloklarda. Aynı şekilde küçük "i" ve büyük "İ" harfleri de farklı bloklarda.

ç LATIN_1_SUPPLEMENT
ğ LATIN_EXTENDED_A
ı LATIN_EXTENDED_A
i BASIC_LATIN
ö LATIN_1_SUPPLEMENT
ş LATIN_EXTENDED_A
ü LATIN_1_SUPPLEMENT

Ç LATIN_1_SUPPLEMENT
Ğ LATIN_EXTENDED_A
I BASIC_LATIN
İ LATIN_EXTENDED_A
Ö LATIN_1_SUPPLEMENT
Ş LATIN_EXTENDED_A
Ü LATIN_1_SUPPLEMENT

2.3 BMP Latin Extended-A
Latin Extended-A bloğu 256'dan 383'e kadar Unicode karakterleri içerir.

2.4 BMP  General Punctuation
RIGHT-TO-LEFT OVERRIDE
Şöyle yaparız. Çıktı olarak "hello world!" alırız.
greet = "‮".toString.bind("hello world!")

1 Şubat 2021 Pazartesi

Unicode Normalizasyonu

Giriş
Önce bazı kavramları bilmek lazım

Diacritic
Harflere eklenen fonetik işaretlerdir. Örneğin Fransızca'da bulunur

Transliteration
Latin alfabesi ile yazılmayan bir dilin, Latin alfabesi haline getirilmesidir.

1. Canonical (Geleneksel) Yöntem - NFD
Türkçede veya başka dillerde olan bazı harflerin yerine o harfin eşi sayılabilecek bir başka karakteri koymaya deniyor. Örneğin Türkçe 'deki Ç harfinin yerine C harfinin kullanılması gibi. Normalize edilen tek karakter, iki karakter haline gelebilir. Açıklaması şöyle
However, if you are accepting passwords that contain non-ASCII characters, you probably want to do some sort of Unicode normalization on the string (probably NFC), since there are often multiple ways to express the same logical character. For example, you could express "é" as a single code point (U+00E9) or as two code points (U+0065 U+0301), and normalization will rewrite these to the same string. 
Konuyla ilgili  Normal Forms yazısına bakılabilir.

Java
Şöyle yapılır.
String s = ...
s = Normalizer.normalize(s, Normalizer.Form.NFD);
QT
QT ile aksan işaretlerini atmak için Removing accents from a QString sorusundaki gibi
QString s2 = s.normalized(QString::NormalizationForm_D);
kodu kullanılabilir.

2. NFKD
NFKD daha çok Diyakritik (Mevcut harflere yapılan fonetik işaretler) harflerde kullanılıyor.
Java
Gördüğüm en iyi örnek burada. Normalizer sınıfı kullanılıyor.
Normalizer.normalize("Indianapòlis", Normalizer.Form.NFKD).
  replaceAll("\\p{InCombiningDiacriticalMarks}+", "");//Indianapolis verir
Normalizer.Form.NFKD ile Diyakritik işaretleri önce genişletiyor. (Compatibility Decomposition, yani unicode karakter iki karakter olacak şekilde bölünüyor.). Daha sonra düzenli ifade ile eklentileri siliyor.
Benzer bir örnek te Remove diacritical marks from unicode chars yazısında bulunabilir.

C#
Yunan alfabesindeki mü ve micro işareti farklı bloklarda karakterler. Aynı gösterime sahip olmalarına rağmen equals() ile karşılaştırıldıkları zaman eşit değiller. Aşağıdaki örnekte eşit olmaları sağlanıyor.
char first = 'μ';
char second = 'µ';
string firstNormalized = first.ToString().Normalize(NormalizationForm.FormKD);
string secondNormalized = second.ToString().Normalize(NormalizationForm.FormKD);
Console.WriteLine(first.Equals(second));                     // False
Console.WriteLine(firstNormalized.Equals(secondNormalized)); // True
Linux
iconv komutu kullanılabilir.

6 Şubat 2020 Perşembe

Unicode Düzlemleri (Plane)

Giriş
Unicode Code Point'leri "plane" (düzlem) ve "block" olarak ayrılmış durumda. 17 tane plane (düzlem) var. Her düzlem 65,535 kod noktası alabilir. 11 tane düzlem şu anda boş. Yani Unicode içinde halen bir sürü boş yer var.

Düzlemler ise block'lardan oluşuyor. Block'ların büyüklüğü sabit değil.

1. Unicode ve ISO/EIC 10646 İlişkisi
Açıklaması şöyle. Yani UCS ve Unicode aynı şeyler.
The Universal Coded Character Set (UCS) is a standard set of characters defined by the International Standard ISO/IEC 10646, Information technology — Universal Coded Character Set (UCS) (plus amendments to that standard), which is the basis of many character encodings. The latest version contains over 136,000 abstract characters, each identified by an unambiguous name and an integer number called its code point. This ISO/IEC 10646 standard is maintained in conjunction with The Unicode Standard ("Unicode"), and they are code-for-code identical.
2. Basic Multilingual Plane (BMP)
2. Basic Multilingual Plane (BMP) yazısına taşıdım

3. Private-Use Characters
Açıklaması şöyle
U+E000 to U+F8FF is a private-use area. It's reserved to allow systems to store and display characters that are not present in Unicode.

4. Emoji
Emoji'nin Unicode'a girmesinin açıklaması şöyle
Emoji were first developed by major telcos in Japan as an extension to their own text encoding schemes and became popular with the customer base. Afterwards, when Apple invaded the Japanese market with iPhone, people were upset they couldn't use emoji. Apple decided to implement emoji into iPhone, forcing the Unicode Consortium to include it into Unicode as well.

Because of Unicode's philosophy (make sure we can encode all written text), they have included all the existing emoji. This caused a lot of "Japanese" things to be included which were never made for other countries. For example, for years the Japanese flag was the only country flag in Unicode as well.
5. Kategoriler
Her Code Point belli bir kategoriye dahildir. Açıklaması şöyle.
Each Unicode point also has a property called "General Category", that attempts to describes the role of the corresponding symbol in the languages or applications for whose sake it was included in the system. Examples of General Categories are "Lu" (meaning upper-case letter), "Nd" (decimal digit), "Pi" (open-quote punctuation), and "Mn" (non-spacing mark, i.e. a diacritic for the preceding glyph). This division is completely independent of code blocks: the code points with a given General Category generally span many blocks, and do not have to be consecutive, not even within each block.[3]
5.1 Number, Other [No]
Tablo burada. Şunun gibi karakterleri içerir.
"[¼½¾⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞↉]"


2 Ağustos 2017 Çarşamba

Unicode

Giriş
Unicode karakterleri temsil etmek için UTF-8 , UTF-16, UTF-32 kodeklerinden herhangi birisi kullanılabilir.

Unicode Gösterimi
Unicode ile kullanılan sayılar geleneksel olarak hex'tir.\uFFFF hex şeklinde gösterilir.

Örnek - Eğlenceli Bir Hile
Java'da şöyle yaparız. // \u000d new line karakterine denk gelir.
// \u000d System.out.println(“abracadabra!”)
Yani kod aslında şöyledir. Dolayısıyla System.out çalışır
// \u000d System.out.println(“abracadabra!”)

Unicode Düzlemleri
Unicode Düzlemleri yazısına taşıdım.

Code Point - Kod Noktası
Şu anki unicode aralığı U+0000 - U+10FFFF arasında. Yani Unicode 8.0'da 1,114,111 karakter için yer var. Şu anda sadece 120,737 tane karakter kullanımda. Kod Noktası bu aralıktaki (kod uzayı) bir sayıyı temsil ediyor.

Neden Code Point Lazım?
Unicode Standardı ilk çıktığında  kod uzayı bu kadar büyük değildi ve 16 bitlik kodeklerin bu kod uzayını temsil yeterli olacağı varsayılmıştı. Ancak daha sonra kod uzayı büyüyünce 16 bitten daha fazla yer kullanan yeni bir kodek kullanılmaya başlandı. Şu andaki 32 bit karakterler ise şöyle temsil edilirler.
Nevertheless, Unicode has come up with a solution for still using 16 bits to represent these characters. This solution implies the following:

16-bit high surrogates: 1,024 values (U+D800 to U+DBFF)
16-bit low surrogates: 1,024 values (U+DC00 to U+DFFF)
Java
Dolayısıyla Java'da eski 16 bit ve yeni 32 bit Code Point için metodlar var. String.chars() ve String.codePoints() Farkı yazısına bakabilirsiniz.

Bidirectional Sınıf
Bazı karakterler sağdan sola (İbranice, Arapça gibi) bazıları ise soldan sağa (Latin harfleri) yazılır. Bazı karakterler ise (rakamlar) tarafsızdır. Örneğin 0 rakamı eğer sağdan sola yazılan bir karakter varsa sola doğru yazılır. Yani hemen yanındaki karaktere bakarak yönü belirlenir.

Unicode Normalizasyonu
Unicode Normalizasyonu yazısına taşıdım

Karakter Setleri
Bir çok karakter seti mevcut. Java'daki character seti listesini buradan görebilirsiniz.