Skip to content

4. Karakter dizileri

Image

4.1. [str_01] komut dosyası: karakter dizilerinin notasyonu

[str_01] betiği şöyledir:


# karakter dizileri
# üç olası gösterim biçimi
chaine1 = "un"
chaine2 = 'deux'
chaine3 = """hélène va au
 marché acheter des légumes"""
# görüntüleme
print(f"chaine1=[{chaine1}], chaine2=[{chaine2}], chaine3=[{chaine3}]")

Açıklamalar

    1. satır: tırnak işaretleri " ile sınırlandırılmış bir dize;
    1. satır: tek tırnak ' ile sınırlandırılmış bir dize;
    1. satır: üçlü tırnak işaretleriyle """ sınırlandırılmış bir dize. Bu durumda, dize birden fazla satıra yayılabilir;

Sonuçlar şöyledir:


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_01.py
chaine1=[un], chaine2=[deux], chaine3=[hélène va au
 marché acheter des légumes]

Process finished with exit code 0

4.2. [str_02] betiği: <str> sınıfının yöntemleri

[str_02] betiği, karakter dizileri sınıfı olan <str> sınıfının bazı yöntemlerini gösterir:


# karakter dizileri üzerinde işlevler
# küçük harfli dize
print(f"'ABCD'.lower()={'ABCD'.lower()}")
# büyük harfli dize
print(f"'abcd'.upper()={'abcd'.upper()}")
# 2 numaralı karakter
print(f"'cheval[2]={'cheval'[2]}")
# 5 ve 6 numaralı karakterleri içeren alt dize
print(f"'caractères accentués'[5:7]={'caractères accentués'[5:7]}")
# 4. karakterden başlayıp bu karakteri de içeren alt dize
print(f"'caractères accentués'[4:]={'caractères accentués'[4:]}")
# 6. karakter hariç olan alt dize
print(f"'caractères accentués'[:5]={'caractères accentués'[:5]}")
# dizenin uzunluğu
print(f"len('123')={len('123')}")
# dizenin başındaki ve sonundaki boşlukların kaldırılması
print(f"'  abcd '.strip()=[{'  abcd '.strip()}]")
# dizenin sonundaki boşlukların kaldırılması
print(f"'  abcd '.rstrip()=[{'  abcd '.rstrip()}]")
# dizenin başındaki boşlukların kaldırılması
print(f"'  abcd '.lstrip()=[{'  abcd '.lstrip()}]")
# "boşluk" terimi aslında farklı karakterleri kapsar
str = '  \r\nabcd \t\f'
print(f"str.strip()=[{str.strip()}]")
# bir alt dizgenin başka bir alt dizgeyle değiştirilmesi
print(f"'abcd'.replace('a','x')={'abcd'.replace('a', 'x')}")
print(f"'abcd'.replace('ab','xy')={'abcd'.replace('ab', 'xy')}")
# alt dize arama: konumu döndürür veya alt dize bulunmazsa -1 değerini döndürür
print(f"'abcd'.find('bc')={'abcd'.find('bc')}")
print(f"'abcd'.find('bc')={'abcd'.find('Bc')}")
# bir dizgenin başlangıcı
print(f"'abcd'.startswith('ab')={'abcd'.startswith('ab')}")
print(f"'abcd'.startswith('x')={'abcd'.startswith('x')}")
# dizenin sonu
print(f"'abcd'.endswith('cd')={'abcd'.endswith('cd')}")
print(f"'abcd'.endswith('x')={'abcd'.endswith('x')}")
# dize listesinden bir dizeye geçiş
print(f"'[X]'.join(['abcd', '123', 'èéà'])={'[X]'.join(['abcd', '123', 'èéà'])}")
print(f"''.join(['abcd', '123', 'èéà'])={''.join(['abcd', '123', 'èéà'])}")
# bir dizeden bir dizi listesine geçiş
print(f"'abcd 123 cdXY'.split('cd')={'abcd 123 cdXY'.split('cd')}")
# bir dizeden kelimeleri alma
print(f"'abcd 123 cdXY'.split(None)={'abcd 123 cdXY'.split(None)}")

Elde edilen sonuçlarla birlikte verilen açıklamalar, betiği anlamak için yeterlidir. Sonuçlar şöyledir:


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_02.py
'ABCD'.lower()=abcd
'abcd'.upper()=ABCD
'at[2]=e
'aksanlı karakterler'[5:7]=tè
'aksanlı karakterler'[4:]=aksanlı karakterler
'aksanlı karakterler'[:5]=karak
len('123')=3
'  abcd '.strip()=[abcd]
'  abcd '.rstrip()=[  abcd]
'  abcd '.lstrip()=[abcd ]
str.strip()=[abcd]
'abcd'.replace('a','x')=xbcd
'abcd'.replace('ab','xy')=xycd
'abcd'.find('bc')=1
'abcd'.find('bc')=-1
'abcd'.startswith('ab')=True
'abcd'.startswith('x')=False
'abcd'.endswith('cd')=True
'abcd'.endswith('x')=False
'[X]'.join(['abcd', '123', 'èéà'])=abcdQZXW2HTMLBW1hdZQX123QZXW2HTMLBW1hdZQXèéà
''.join(['abcd', '123', 'èéà'])=abcd123èéà
'abcd 123 cdXY'.split('cd')=['ab', ' 123 ', 'XY']
'abcd 123 cdXY'.split(None)=['abcd', '123', 'cdXY']

Process finished with exit code 0

4.3. [str_03] betiği: karakter dizilerinin kodlanması (1)

[str_03] betiği, karakter dizilerinin kodlanmasıyla ilgili kavramları sunar:


# karakter kodlaması

# str türünde dize
str = "hélène va au marché acheter des légumes"
print(f"str=[{str}, type={type(str)}]")
# utf-8 kodlaması
print("--- utf-8")
bytes1 = str.encode('utf-8')
print(f"bytes1={bytes1}, type={type(bytes1)}")
bytes2 = bytes(str, 'utf-8')
print(f"bytes2={bytes2}, type={type(bytes2)}")
# iso-8859-1 kodlaması
print("--- iso-8859-1")
bytes1 = str.encode('iso-8859-1')
print(f"bytes1={bytes1}, type={type(bytes1)}")
bytes2 = bytes(str, 'iso-8859-1')
print(f"bytes2={bytes2}, type={type(bytes2)}")
# latin1=iso-8859-1 kodlaması
print("--- latin1")
bytes1 = str.encode('latin1')
print(f"bytes1={bytes1}, type={type(bytes1)}")
bytes2 = bytes(str, 'latin1')
print(f"bytes2={bytes2}, type={type(bytes2)}")

<str> türündeki bir karakter dizisinin kodlanması, dizideki her karakterin bir veya daha fazla bayt ile temsil edildiği bir ikili diziyi oluşturur. Farklı kodlama türleri mevcuttur. Yukarıdaki komut dosyası, Batı'da en yaygın olan iki tür olan "utf-8" ve "iso-8859-1" (aynı zamanda "latin1" olarak da bilinir) kodlamalarını ele almaktadır.

Kodlama/kod çözme ilkesi aşağıda gösterilmiştir (bkz. |https://realpython.com/python-encodings-guide/ |):

Image

Açıklamalar

  • 4-5. satırlar: Kodlanacak başlangıç karakter dizisi. <str> türündeki örnekler, |https://docs.python.org/3/howto/unicode.html|, |https://realpython.com/python-encodings-guide/ | gibi Unicode dizileridir;
  • 6-11. satırlar: Bir karakter dizisini UTF68 ile kodlamanın iki yolu:
      1. satır: str.encode('utf-8);
    • satır 10: bytes(str, 'utf-8');
  • satır 12-17: 'iso-8859-1' kodlamasıyla aynı işlemi tekrar yapıyoruz;
  • satır 18-23: 'latin1', 'iso-8859-1' kodlamasının başka bir adıdır;

Sonuçlar şöyledir:


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_03.py
str=[hélène va au marché acheter des légumes, type=<class 'str'>
--- utf-8
bytes1=b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes', type=<class 'bytes'>
bytes2=b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes', type=<class 'bytes'>
--- iso-8859-1
bytes1=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
bytes2=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
--- latin1
bytes1=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
bytes2=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>

Process finished with exit code 0

Yorumlar

  • 4. satır: Aksanlı karakterlerin iki bayt olarak kodlandığını görüyoruz:
    • é: [\xc3\xa9], bu da 11000011 10101001 ikili dizisidir;
    • è: [\xc3\xa8]; bu, 11000011 10101000 ikili dizisidir;
    1. satır: iso-8859-1 kodlamasında, bu iki aksanlı karakter farklı şekilde kodlanmıştır:
    2. é: [\xe9]; bu, 11101001 ikili dizisidir;
    3. è: [\xe8], bu da 11101000 ikili dizisidir;

4.4. [str_04] betiği: karakter dizilerinin kodlanması (2)

[str_04] betiği, 'base64' ve 'quoted-printable' olmak üzere iki farklı kodlama türü daha sunar. Bu iki kodlama türü, Unicode karakter dizilerini değil, ikili nesneleri kodlar. Örneğin, bir e-postaya Word belgesi eklediğinizde, kullanılan e-posta istemcisine bağlı olarak bu belge bu iki kodlamadan birine tabi tutulur. Ekli dosyaların çoğu için durum böyledir.

Komut dosyası şöyledir:


# kodlama / kod çözme
import codecs

# dize
print("---- chaîne unicode")
str1 = "hélène va au marché acheter des légumes"
print(f"str1=[{str1}], type(str1)={type(str1)}")

# UTF-8 kodlaması
print("---- chaîne unicode -> binaire utf-8")
bytes1 = bytes(str1, "utf-8")
print(f"bytes1=[{bytes1}], type(bytes1)={type(bytes1)}")

# UTF-8 kod çözme
print("---- binaire utf-8 -> chaîne unicode")
str2 = bytes1.decode("utf-8")
print(f"str2=[{str2}], type(str2)={type(str2)}")
print(f"str2==str1={str2 == str1}")

# iso-8859-1 kodlaması
print("---- chaîne unicode -> binaire iso-8859-1")
bytes2 = bytes(str1, "iso-8859-1")
print(f"bytes2=[{bytes2}], type(bytes2)={type(bytes2)}")

# ISO-8859-1 kod çözme
print("---- binaire iso-8859-1 -> chaîne unicode")
str3 = bytes2.decode("iso-8859-1")
print(f"str3=[{str3}], type(str3)={type(str3)}")
print(f"str3==str1={str3 == str1}")

# kod çözme hatası - bytes1 utf-8 formatında - iso-8859-1 olarak kod çözülüyor
print("--- binaire utf-8 (décodage iso-8859-1) --> chaîne unicode")
str4 = bytes1.decode("iso-8859-1")
print(f"str4=[{str4}], type(str4)={type(str4)}")

# Unicode dizisinin utf-8 kodlaması
print("---- chaîne unicode -> binaire utf-8")
bytes3 = codecs.encode(str1, "utf-8")
print(f"bytes3=[{bytes3}], type(bytes3)={type(bytes3)}")

# UTF-8 ikili dizesinin base64 ile kodlanması
print("---- binaire utf-8 -> binaire base64")
bytes4 = codecs.encode(bytes1, "base64")
print(f"bytes4=[{bytes4}], type(bytes4)={type(bytes4)}")

# orijinal Unicode dizesine geri dönüş
print("---- binaire base64 -> binaire utf-8 -> chaîne unicode")
str6 = codecs.decode(bytes4, "base64").decode("utf-8")
print(f"str6=[{str6}], type(str6)={type(str6)}")

# bir ikili dizgenin quoted-printable olarak kodlanması
print("---- binaire utf-8 -> binaire quoted-printable")
str7 = codecs.encode(bytes1, "quoted-printable")
print(f"str7=[{str7}], type(str7)={type(str7)}")

# orijinal Unicode dizesine geri dönüş
print("---- binaire quoted-printable -> binaire utf-8 -> chaîne unicode")
str8 = codecs.decode(str7, "quoted-printable").decode("utf-8")
print(f"str8=[{str8}], type(str8)={type(str8)}")

Açıklamalar

    1. satır: [codecs] modülü, 'base64' ve 'quoted-printable' kodlamalarını yapmayı sağlar. Bunun dışında birçok başka kodlama da yapabilir;
  • 4-7. satırlar: Çeşitli kodlamalara tabi tutulacak Unicode dizesi;
  • 9-12. satırlar: utf-8 kodlaması. Sonuçta bir ikili dosya elde edilir;
  • satır 14-18: orijinal Unicode dizesine geri dönmek için utf-8 kod çözme işlemi;
  • 20-29. satırlar: Aynı işlem 'iso-8859-1' kodlamasıyla tekrarlanır;
  • satır 31-34: bir kod çözme hatası gösterilir:
  • satır 33: bytes1, 'utf-8' ile kodlanmış bir ikili dizidir. Bu dizi 'iso-8859-1' ile kod çözülür;
  • satır 36-39: [codecs] modülü kullanılarak bir karakter dizisini utf-8 olarak kodlamanın başka bir yolu;
  • satır 41-44: bir 'utf-8' ikili dizesi 'base64' olarak kodlanıyor;
  • satır 46-49: 'base64' ikili dizisinden orijinal Unicode dizisine nasıl geçileceğini gösterir;
  • 51-59. satırlar: Bu işlem, 'base64' yerine 'quoted-printable' kodlamasıyla tekrarlanır;

Sonuçlar şöyledir:


C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_04.py
---- chaîne unicode
str1=[hélène va au marché acheter des légumes], type(str1)=<class 'str'>
---- chaîne unicode -> binaire utf-8
bytes1=[b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes'], type(bytes1)=<class 'bytes'>
---- binaire utf-8 -> chaîne unicode
str2=[hélène va au marché acheter des légumes], type(str2)=<class 'str'>
str2==str1=True
---- chaîne unicode -> binaire iso-8859-1
bytes2=[b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes'], type(bytes2)=<class 'bytes'>
---- binaire iso-8859-1 -> chaîne unicode
str3=[hélène va au marché acheter des légumes], type(str3)=<class 'str'>
str3==str1=True
--- binaire utf-8 (décodage iso-8859-1) --> chaîne unicode
str4=[hélène va au marché acheter des légumes], type(str4)=<class 'str'>
---- chaîne unicode -> binaire utf-8
bytes3=[b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes'], type(bytes3)=<class 'bytes'>
---- binaire utf-8 -> binaire base64
bytes4=[b'aMOpbMOobmUgdmEgYXUgbWFyY2jDqSBhY2hldGVyIGRlcyBsw6lndW1lcw==\n'], type(bytes4)=<class 'bytes'>
---- binaire base64 -> binaire utf-8 -> chaîne unicode
str6=[hélène va au marché acheter des légumes], type(str6)=<class 'str'>
---- binaire utf-8 -> binaire quoted-printable
str7=[b'h=C3=A9l=C3=A8ne=20va=20au=20march=C3=A9=20acheter=20des=20l=C3=A9gumes'], type(str7)=<class 'bytes'>
---- binaire quoted-printable -> binaire utf-8 -> chaîne unicode
str8=[hélène va au marché acheter des légumes], type(str8)=<class 'str'>

Process finished with exit code 0
  • 14-15. satırlar: Bir utf-8 ikili dosyası, yanlış 'iso-8859-1' kod çözücüyle Unicode dizesine dönüştürülür. Bu nedenle, oluşturulan bazı Unicode karakterleri hatalıdır; burada aksanlı karakterler söz konusudur;
  • 18-19. satırlar: 'base64' kodlaması, herhangi bir ikili veriyi kodlamak için 64 ASCII karakterinin (7 bitlik kodlanmış) kullanılmasını içerir. Görüldüğü gibi bu, dizgenin ikili boyutunu artırır;
  • 22-23. satırlar: 'quoted-printable' kodlaması da herhangi bir ikili veriyi kodlamak için ASCII karakterlerini (7 bitlik kodlanmış) kullanmayı içerir;

Unutulmamalıdır ki, örneğin internetten bir metni temsil eden bir ikili veri alındığında, bu metni geri kazanmak için verinin hangi kodlamalardan geçtiğini bilmek gerekir.