forked from yazbel/python-istihza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
karakter_kodlama.html
1813 lines (1729 loc) · 118 KB
/
karakter_kodlama.html
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="tr">
<html lang="tr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta content="Python 3.x'te karakter dizileri ve karakter kodlamaları" name="description" />
<meta content="python, string, karakter dizisi, karakter kodlamaları, unicode, encoding, ascii, utf-8" name="keywords" />
<title>Karakter Kodlama (Character Encoding) — Python 3 için Türkçe Kılavuz</title>
<link rel="stylesheet" href="_static/pyramid.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script>
<script src="_static/translations.js"></script>
<link rel="search" title="Ara" href="search.html" />
<link rel="next" title="Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)" href="baytlar_ve_bayt_dizileri.html" />
<link rel="prev" title="Basit bir İletişim Modeli" href="basit_bir_iletisim_modeli.html" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="_static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head><body>
<div class='header'><a href='https://yazbel.com'>yazbel.com</a></div>
<ul class='navbar'>
<li><a href="#"><del>pdf desteği sonlanmıştır</del></a></li>
<li class="forum"><a href="http://forum.yazbel.com">forum</a></li>
</ul>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="baytlar_ve_bayt_dizileri.html" title="Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)"
accesskey="N">sonraki</a></li>
<li class="right" >
<a href="basit_bir_iletisim_modeli.html" title="Basit bir İletişim Modeli"
accesskey="P">önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Karakter Kodlama (<em>Character Encoding</em>)</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="body" role="main">
<div class="section" id="karakter-kodlama-character-encoding">
<h1>Karakter Kodlama (<em>Character Encoding</em>)<a class="headerlink" href="#karakter-kodlama-character-encoding" title="Bu başlık için kalıcı bağlantı">¶</a></h1>
<p>Bu bölüme gelinceye kadar Python programlama dilindeki karakter dizisi, liste ve
dosya adlı veri tiplerine ilişkin epey söz söyledik. Artık bu veri tiplerine
dair hemen hemen bütün ayrıntıları biliyoruz. Ancak henüz öğrenmediğimiz, ama
programcılık maceramız açısından mutlaka öğrenmemiz gereken çok önemli bir konu
daha var. Bu önemli konunun adı, karakter kodlama.</p>
<p>Bu bölümde ‘karakter kodlama’ adlı hayati konuyu işlemenin yanısıra, son birkaç
bölümde üstünkörü bir şekilde üzerinden geçtiğimiz, ama derinlemesine incelemeye
pek fırsat bulamadığımız bütün konuları da ele almaya çalışacağız. Bu konuyu
bitirdikten sonra, önceki konuları çalışırken zihninizde oluşmuş olabilecek
boşlukların pek çoğunun dolduğunu farkedeceksiniz. Sözün özü, bu bölümde hem
yeni şeyler söyleyeceğiz, hem de halihazırda öğrendiğimiz şeylerin bir kez daha
üzerinden geçerek bunların zihnimizde iyiden iyiye pekişmesini sağlayacağız.</p>
<p>Hatırlarsanız önceki derslerimizde karakter dizilerinin <code class="docutils literal notranslate"><span class="pre">encode()</span></code> adlı bir
metodu olduğundan söz etmiştik. Aynı şekilde, dosyaların da <cite>encoding</cite> adlı bir
parametresi olduğunu söylemiştik. Ayrıca bu <em>encoding</em> konusu, ilk derslerimizde
metin düzenleyici ayarlarını anlatırken de karşımıza çıkmıştı. Orada, yazdığımız
programlarda özellikle Türkçe karakterlerin düzgün görünebilmesi için,
kullandığımız metin düzenleyicinin dil kodlaması (<em>encoding</em>) ayarlarını düzgün
yapmamız gerektiğini üstüne basa basa söylemiştik. Biz şu ana kadar bu konuyu
ayrıntılı olarak ele almamış da olsak, siz şimdiye kadar yazdığınız programlarda
Türkçe karakterleri kullanırken halihazırda pek çok problemle karşılaşmış ve bu
sorunların neden kaynaklandığını anlamakta zorlanmış olabilirsiniz.</p>
<p>İşte bu bölümde, o zaman henüz bilgimiz yetersiz olduğu için ertelediğimiz bu
<em>encoding</em> konusunu bütün ayrıntılarıyla ele alacağız ve yazdığımız programlarda
Türkçe karakterleri kullanırken neden sorunlarla karşılaştığımızı, bu sorunun
temelinde neyin yattığını anlamaya çalışacağız.</p>
<p>O halde hiç vakit kaybetmeden bu önemli konuyu incelemeye başlayalım.</p>
<div class="section" id="giris">
<h2>Giriş<a class="headerlink" href="#giris" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Önceki bölümlerde sık sık tekrar ettiğimiz gibi, bilgisayar dediğimiz şey,
üzerinden elektrik geçen devrelerden oluşmuş bir sistemdir. Eğer bir devrede
elektrik yoksa o devrenin değeri <cite>0</cite> volt iken, o devreden elektrik geçtiğinde
devrenin değeri yaklaşık <cite>+5</cite> volttur.</p>
<p>Gördüğünüz gibi, ortada iki farklı değer var: <cite>0</cite> volt ve <cite>+5</cite> volt. İkili
(<em>binary</em>) sayma sisteminde de iki değer bulunur: <cite>0</cite> ve <cite>1</cite>. İşte biz bu <cite>0</cite>
volt’u ikili sistemde <cite>0</cite> ile, <cite>+5</cite> volt’u ise <cite>1</cite> ile temsil ediyoruz. Yani
devreden elektrik geçtiğinde o devrenin değeri <cite>1</cite>, elektrik geçmediğinde ise
<cite>0</cite> olmuş oluyor. Tabii bilgisayar açısından bakıldığında devrede elektrik
vardır veya yoktur. Biz insanlar bu ikili durumu daha kolay bir şekilde manipüle
edebilmek için farklı voltaj durumlarından her birine sırasıyla <cite>0</cite> ve <cite>1</cite> gibi
bir ad veriyoruz. Yani iki farklı voltaj değerini iki farklı sayı halinde
‘kodlamış’ oluyoruz…</p>
<p>Hatırlarsanız bir önceki bölümde tasarladığımız basit iletişim modelinde de
ampulün loş ışık vermesini sağlayan düşük elektrik sinyallerini <cite>0</cite> ile, parlak
ışık vermesini sağlayan yüksek elektrik sinyallerini ise <cite>1</cite> ile temsil
etmiştik. Bu temsil işine de teknik olarak ‘kodlama’ (<em>encoding</em>) adı
verildiğini söylemiştik. İşte bilgisayarlar açısından da benzer bir durum söz
konusudur. Bilgisayarlarda da <cite>0</cite> volt ve <cite>+5</cite> volt değerleri sırasıyla ikili
sayma sistemindeki <cite>0</cite> ve <cite>1</cite> sayıları halinde kodlanabilir.</p>
<p>Sözün özü ilk başta yalnızca iki farklı elektrik sinyali vardır. Elbette bu
elektrik sinyalleri ile doğrudan herhangi bir işlem yapamayız. Mesela elektrik
sinyallerini birbiriyle toplayıp, birbirinden çıkaramayız. Ama bu sinyalleri bir
sayma sistemi ile temsil edersek (yani bu sinyalleri o sayma sisteminde
kodlarsak), bunları kullanarak, örneğin, aritmetik işlemleri rahatlıkla
gerçekleştirebiliriz. Mesela <cite>0</cite> volt ile <cite>+5</cite> voltu birbiriyle toplayamayız,
ama <cite>0</cite> voltu ikili sistemdeki <cite>0</cite> sayısıyla, <cite>+5</cite> voltu ise ikili sistemdeki
<cite>1</cite> sayısıyla kodladıktan sonra bu ikili sayılar arasında her türlü aritmetik
işlemi gerçekleştirebiliriz.</p>
<p>Bilgisayarlar yalnızca iki farklı voltaj durumundan anladığı ve bu iki farklı
voltaj durumu da ikili sayma sistemindeki iki farklı sayı ile kolayca temsil
edilebildiği için, ilk bilgisayarlar çoğunlukla sadece hesap işlemlerinde
kullanılıyordu. Karakterlerin/harflerin bilgisayar dünyasındaki işlevi bir hayli
kısıtlıydı. Metin oluşturma işi o zamanlarda daktilo ve benzeri araçların görevi
olarak görülüyordu. Bu durumu, telefon teknolojisi ile kıyaslayabilirsiniz. İlk
telefonlar da yalnızca iki kişi arasındaki sesli iletişimi sağlamak gibi kısıtlı
bir amaca hizmet ediyordu. Bugün ise, geçmişte pek çok farklı cihaza
paylaştırılmış görevleri akıllı telefonlar aracılığıyla tek elden
halledebiliyoruz.</p>
<p>Peki bir bilgisayar yalnızca elektrik sinyallerinden anlıyorsa, biz mesela
bilgisayarları nasıl oluyor da metin girişi için kullanabiliyoruz?</p>
<p>Bu sorunun cevabı aslında çok açık: Birtakım elektrik sinyallerini, birtakım
aritmetik işlemleri gerçekleştirebilmek amacıyla nasıl birtakım sayılar halinde
kodlayabiliyorsak; birtakım sayıları da, birtakım metin işlemlerini
gerçekleştirebilmek amacıyla birtakım karakterler halinde kodlayabiliriz.</p>
<p>Peki ama nasıl?</p>
<p>Bir önceki bölümde bahsettiğimiz basit iletişim modeli aracılığıyla bunun nasıl
yapılacağını anlatmıştık. Tıpkı bizim basit iletişim sistemimizde olduğu gibi,
bilgisayarlar da yalnızca elektrik sinyallerini görür. Tıpkı orada yaptığımız
gibi, bilgisayarlarda da hangi elektrik sinyalinin hangi sayıya; hangi sayının
da hangi karaktere karşılık geleceğini belirleyebiliriz. Daha doğrusu,
bilgisayarların gördüğü bu elektrik sinyallerini sayılara ve karakterlere
dönüştürebiliriz. Dışarıdan girilen karakterleri de, bilgisayarların
anlayabilmesi için tam aksi istikamette sayıya, oradan da elektrik sinyallerine
çevirebiliriz. İşte bu dönüştürme işlemine karakter kodlama (<em>character encoding</em>)
adı verilir.</p>
<p>Bu noktada şöyle bir soru akla geliyor: Tamam, sayıları karakterlere,
karakterleri de sayılara dönüştüreceğiz. Ama peki hangi sayıları hangi
karakterlere, hangi karakterleri de hangi sayılara dönüştüreceğiz? Yani mesela
ikili sistemdeki <cite>0</cite> sayısı hangi karaktere, <cite>1</cite> sayısı hangi karaktere, <cite>10</cite>
sayısı hangi karaktere karşılık gelecek?</p>
<p>Siz aslında bu sorunun cevabını da biliyorsunuz. Yine bir önceki bölümde
anlattığımız gibi, hangi sayıların hangi karakterlere karşılık geleceğini,
sayılarla karakterlerin eşleştirildiği birtakım tablolalar yardımıyla rahatlıkla
belirleyebiliriz.</p>
<p>Bu iş ilk başta kulağa çok kolaymış gibi geliyor. Esasında iş kolaydır, ama
şöyle bir problem var: Herkes aynı sayıları aynı karakterlerle eşleştirmiyor
olabilir. Mesela durumu bir önceki bölümde tasarladığımız basit iletişim modeli
üzerinden düşünelim. Diyelim ki, başta yalnızca bir arkadaşınızla ikinizin
arasındaki iletişimi sağlamak için tasarladığınız bu sistem başkalarının da
dikkatini çekmiş olsun… Tıpkı sizin gibi, başkaları da loş ışık-parlak ışık
karşıtlığı üzerinden birbiriyle iletişim kurmaya karar vermiş olsun. Ancak
sistemin temeli herkesçe aynı şekilde kullanılıyor olsa da, karakter eşleştirme
tablolarını herkes aynı şekilde kullanmıyor olabilir. Örneğin başkaları, kendi
ihtiyaçları çerçevesinde, farklı sayıların farklı karakterlerle eşleştirildiği
farklı tablolar tasarlamış olabilir. Bu durumun dezavantajı, farklı sistemlerle
üretilen mesajların, başka sistemlerde aslı gibi görüntülenemeyecek olmasıdır.
Örneğin ‘a’ harfinin <cite>1010</cite> gibi bir sayıyla temsil edildiği sistemle üretilen
bir mesaj, aynı harfin mesela <cite>1101</cite> gibi bir sayıyla temsil edildiği sistemde
düzgün görüntülenemeyecektir. İşte aynı şey bilgisayarlar için de geçerlidir.</p>
<p>1960’lı yılların ilk yarısına kadar her bilgisayar üreticisi, sayılarla
karakterlerin eşleştirildiği, birbirinden çok farklı tablolar kullanıyordu. Yani
her bilgisayar üreticisi farklı karakterleri farklı sayılarla eşleştiriyordu.
Örneğin bir bilgisayarda <cite>10</cite> sayısı ‘a’ harfine karşılık geliyorsa, başka bir
bilgisayarda <cite>10</cite> sayısı ‘b’ harfine karşılık gelebiliyordu. Bu durumun doğal
sonucu olarak, iki bilgisayar arasında güvenilir bir veri aktarımı
gerçekleştirmek mümkün olmuyordu. Hatta daha da vahimi, aynı firma içinde bile
birden fazla karakter eşleştirme tablosunun kullanıldığı olabiliyordu…</p>
<p>Peki bu sorunun çözümü ne olabilir?</p>
<p>Cevap elbette standartlaşma.</p>
<p>Standartlaşma ilerleme ve uygarlık açısından çok önemli bir kavramdır.
Standartlaşma olmadan ilerleme ve uygarlık düşünülemez. Eğer standartlaşma diye
bir şey olmasaydı, mesela A4 piller boy ve en olarak standart bir ölçüye sahip
olmasaydı, evde kullandığınız küçük aletlerin pili bittiğinde uygun pili satın
almakta büyük zorluk çekerdiniz. Banyo-mutfak musluklarındaki plastik contanın
belli bir standardı olmasaydı, conta eskidiğinde yenisini alabilmek için
eskisinin ölçülerini inceden inceye hesaplayıp bu ölçülere göre yeni bir conta
arayışına çıkmanız gerekirdi. Herhangi bir yerden bulduğunuz contayı herhangi
bir muslukta kullanamazdınız. İşte bu durumun aynısı bilgisayarlar için de
geçerlidir. Eğer bugün karakterlerle sayıları eşleştirme işlemi belli bir
standart üzerinden yürütülüyor olmasaydı, kendi bilgisayarınızda oluşturduğunuz
bir metni başka bir bilgisayarda açtığınızda aynı metni göremezdiniz. İşte
1960’lı yıllara kadar bilgisayar dünyasında da aynen buna benzer bir sorun
vardı. Yani o dönemde, hangi sayıların hangi karakterlerle eşleşeceği konusunda
uzlaşma olmadığı için, farklı bilgisayarlar arasında metin değiş tokuşu pek
mümkün değildi.</p>
<p>1960’lı yılların başında IBM şirketinde çalışan Bob Bemer adlı bir bilim adamı
bu kargaşanın sona ermesi gerektiğine karar verip, herkes tarafından
benimsenecek ortak bir karakter kodlama sistemi üzerinde ilk çalışmaları
başlattı. İşte ASCII (‘aski’ okunur) böylece hayatımıza girmiş oldu.</p>
<p>Peki bu ‘ASCII’ denen şey tam olarak ne anlama geliyor? Gelin bu sorunun
cevabını, en baştan başlayarak ve olabildiğince ayrıntılı bir şekilde vermeye
çalışalım.</p>
</div>
<div class="section" id="ascii">
<h2>ASCII<a class="headerlink" href="#ascii" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bilgisayarların iki farklı elektrik sinyali ile çalıştığını, bu iki farklı
sinyalin de <cite>0</cite> ve <cite>1</cite> sayıları ile temsil edildiğini, bilgisayarla metin
işlemleri yapabilmek için ise bu sayıların belli karakterlerle eşleştirilmesi
gerektiğini söylemiştik.</p>
<p>Yukarıda da bahsettiğimiz gibi, uygarlık ve ilerleme açısından standartlaşma
önemli bir basamaktır. Şöyle düşünün: Biz bilgisayarların çalışma prensibinde
iki farklı elektrik sinyali olduğunu biliyoruz. Biz insanlar olarak, işlerimizi
daha kolay yapabilmek için, bu sinyalleri daha somut birer araç olan <cite>0</cite> ve <cite>1</cite>
sayılarına atamışız. Eğer devrede elektrik yoksa bu durumu <cite>0</cite> ile, eğer devrede
elektrik varsa bu durumu <cite>1</cite> ile temsil ediyoruz. Esasında bu da bir uzlaşma
gerektirir. Devrede elektrik yoksa bu durumu pekala <cite>0</cite> yerine <cite>1</cite> ile de temsil
edebilirdik… Eğer elektrik sinyallerinin temsili üzerinde böyle bir
uzlaşmazlık olsaydı, her şeyden önce hangi sinyalin hangi sayıya karşılık
geleceği konusunda da ortak bir karara varmamız gerekirdi.</p>
<p>Elektriğin var olmadığı durumu <cite>0</cite> yerine <cite>1</cite> ile temsil etmek akla pek yatkın
olmadığı için uzlaşmada bir problem çıkmıyor. Ama karakterler böyle değildir.
Onlarca (hatta yüzlerce ve binlerce) karakterin sayılarla eşleştirilmesi gereken
bir durumda, ortak bir eşleştirme düzeni üzerinde uzlaşma sağlamak hiç de kolay
bir iş değildir. Zaten 1960’lı yılların başına kadar da böyle bir uzlaşma
sağlanabilmiş değildi. Dediğimiz gibi, her bilgisayar üreticisi sayıları farklı
karakterlerle eşleştiriyor, yani birbirlerinden tamamen farklı karakter kodlama
sistemleri kullanıyordu.</p>
<p>İşte bu kargaşayı ortadan kaldırmak gayesiyle, Bob Bemer ve ekibi hangi
sayıların hangi karakterlere karşılık geleceğini belli bir standarda bağlayan
bir tablo oluşturdu. Bu standarda ise <em>American Standard Code for Information
Interchange</em>, yani ‘Bilgi Alışverişi için Standart Amerikan Kodu’ veya kısaca
‘ASCII’ adı verildi.</p>
<div class="section" id="bitlik-bir-sistem">
<h3>7 Bitlik bir Sistem<a class="headerlink" href="#bitlik-bir-sistem" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>ASCII adı verilen sistem, birtakım sayıların birtakım karakterlerle
eşleştirildiği basit bir tablodan ibarettir. Bu tabloyu
<a class="reference external" href="http://www.asciitable.com/">http://www.asciitable.com/</a> adresinde görebilirsiniz:</p>
<a class="reference external image-reference" href="_images/misc/asciifull.png"><img alt="_images/asciifull.png" class="align-center" src="_images/asciifull.png" style="width: 400px; height: 300px;" /></a>
<p>İsterseniz bu tabloyu Python yardımıyla kendiniz de oluşturabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">128</span><span class="p">):</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">{:<3}{:>8}</span><span class="se">\t</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">i</span><span class="p">))),</span> <span class="n">sep</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Not</p>
<p>Bu kodlarda <code class="docutils literal notranslate"><span class="pre">repr()</span></code> fonksiyonu dışında bilmediğiniz ve
anlayamayacağınız hiçbir şey yok. Biraz sonra <code class="docutils literal notranslate"><span class="pre">repr()</span></code> fonksiyonundan da
bahsedeceğiz. Ama dilerseniz, bu fonksiyonun ne işe yaradığı konusunda en
azından bir fikir sahibi olmak için, yukarıdaki kodları bir de <code class="docutils literal notranslate"><span class="pre">repr()</span></code>
olmadan yazmayı ve aldığınız çıktıyı incelemeyi deneyebilirsiniz.</p>
</div>
<p>ASCII tablosunda toplam 128 karakterin sayılarla eşleştirilmiş durumda olduğunu
görüyorsunuz. Bir önceki bölümde bahsettiğimiz basit iletişim modelinde
anlattıklarımızdan da aşina olduğunuz gibi, 128 adet sayı 7 bite karşılık gelir
(<code class="docutils literal notranslate"><span class="pre">2**7=128</span></code>). Yani 7 bit ile gösterilebilecek son sayı <cite>127</cite>’dir.
Dolayısıyla ASCII 7 bitlik bir sistemdir.</p>
<p>ASCII tablosunu şöyle bir incelediğimizde ilk 32 öğenin göze ilk başta anlamsız
görünen birtakım karakterlerden oluştuğunu görüyoruz:</p>
<blockquote>
<div><table class="docutils align-default">
<colgroup>
<col style="width: 9%" />
<col style="width: 15%" />
<col style="width: 9%" />
<col style="width: 15%" />
<col style="width: 11%" />
<col style="width: 17%" />
<col style="width: 9%" />
<col style="width: 15%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
<th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
<th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
<th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>0</p></td>
<td><p>‘\x00’</p></td>
<td><p>1</p></td>
<td><p>‘\x01’</p></td>
<td><p>2</p></td>
<td><p>‘\x02’</p></td>
<td><p>3</p></td>
<td><p>‘\x03’</p></td>
</tr>
<tr class="row-odd"><td><p>4</p></td>
<td><p>‘\x04’</p></td>
<td><p>5</p></td>
<td><p>‘\x05’</p></td>
<td><p>6</p></td>
<td><p>‘\x06’</p></td>
<td><p>7</p></td>
<td><p>‘\x07’</p></td>
</tr>
<tr class="row-even"><td><p>8</p></td>
<td><p>‘\x08’</p></td>
<td><p>9</p></td>
<td><p>‘\t’</p></td>
<td><p>10</p></td>
<td><p>‘\n’</p></td>
<td><p>11</p></td>
<td><p>‘\x0b’</p></td>
</tr>
<tr class="row-odd"><td><p>12</p></td>
<td><p>‘\x0c’</p></td>
<td><p>13</p></td>
<td><p>‘\r’</p></td>
<td><p>14</p></td>
<td><p>‘\x0e’</p></td>
<td><p>15</p></td>
<td><p>‘\x0f’</p></td>
</tr>
<tr class="row-even"><td><p>16</p></td>
<td><p>‘\x10’</p></td>
<td><p>17</p></td>
<td><p>‘\x11’</p></td>
<td><p>18</p></td>
<td><p>‘\x12’</p></td>
<td><p>19</p></td>
<td><p>‘\x13’</p></td>
</tr>
<tr class="row-odd"><td><p>20</p></td>
<td><p>‘\x14’</p></td>
<td><p>21</p></td>
<td><p>‘\x15’</p></td>
<td><p>22</p></td>
<td><p>‘\x16’</p></td>
<td><p>23</p></td>
<td><p>‘\x17’</p></td>
</tr>
<tr class="row-even"><td><p>24</p></td>
<td><p>‘\x18’</p></td>
<td><p>25</p></td>
<td><p>‘\x19’</p></td>
<td><p>26</p></td>
<td><p>‘\x1a’</p></td>
<td><p>27</p></td>
<td><p>‘\x1b’</p></td>
</tr>
<tr class="row-odd"><td><p>28</p></td>
<td><p>‘\x1c’</p></td>
<td><p>29</p></td>
<td><p>‘\x1d’</p></td>
<td><p>30</p></td>
<td><p>‘\x1e’</p></td>
<td><p>31</p></td>
<td><p>‘\x1f’</p></td>
</tr>
</tbody>
</table>
</div></blockquote>
<div class="admonition note">
<p class="admonition-title">Not</p>
<p>Bu arada, asciitable.com adresinden baktığınız tablo ile yukarıdaki
tablonun birbirinden farklı olduğunu zannedebilirsiniz ilk bakışta. Ama aslında
arada herhangi bir fark yok. Yalnızca iki tablonun karakterleri gösterim şekli
birbirinden farklı. Örneğin asciitable.com’daki tabloda 9 sayısının ‘TAB
(horizontal tab)’ adlı bir karaktere atandığını görüyoruz. Yukarıdaki tabloda
ise 9 sayısının yanında <cite>\t</cite> adlı kaçış dizisi var. Gördüğünüz gibi, ‘TAB
(horizontal tab)’ ifadesi ile <cite>\t</cite> ifadesi aynı karaktere atıfta bulunuyor.
Yalnızca bunların gösterimleri birbirinden farklı, o kadar.</p>
</div>
<p>Aslında bu karakter salatası arasında bizim tanıdığımız birkaç karakter de yok
değil. Mesela 9. sıradaki <cite>\t</cite> öğesinin sekme oluşturan kaçış dizisi olduğunu
söyledik. Aynı şekilde, 10. sıradaki <cite>\n</cite> öğesinin satır başına geçiren kaçış
dizisi olduğunu, 13. sıradaki <cite>\r</cite> öğesinin ise satırı başa alan kaçış dizisi
olduğunu da biliyoruz. Bu tür karakterler ‘basılamayan’ (<em>non-printing</em>)
karakterlerdir. Yani mesela ekranda görüntülenebilen ‘a’, ‘b’, ‘c’, ‘!’, ‘?’,
‘=’ gibi karakterlerden farklı olarak bu ilk 32 karakter ekranda görünmez.
Bunlara aynı zamanda ‘kontrol karakterleri’ (<em>control characters</em>) adı da
verilir. Çünkü bu karakterler ekranda görüntülenmek yerine, metnin akışını
kontrol eder. Bu karakterlerin ne işe yaradığını şu tabloyla tek tek
gösterebiliriz (tablo <a class="reference external" href="http://tr.wikipedia.org/wiki/ASCII">http://tr.wikipedia.org/wiki/ASCII</a> adresinden alıntıdır):</p>
<blockquote>
<div><table class="docutils align-default">
<colgroup>
<col style="width: 8%" />
<col style="width: 41%" />
<col style="width: 11%" />
<col style="width: 39%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>Sayı</p></th>
<th class="head"><p>Karakter</p></th>
<th class="head"><p>Sayı</p></th>
<th class="head"><p>Karakter</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>0</p></td>
<td><p>boş</p></td>
<td><p>16</p></td>
<td><p>veri bağlantısından çık</p></td>
</tr>
<tr class="row-odd"><td><p>1</p></td>
<td><p>başlık başlangıcı</p></td>
<td><p>17</p></td>
<td><p>aygıt denetimi 1</p></td>
</tr>
<tr class="row-even"><td><p>2</p></td>
<td><p>metin başlangıcı</p></td>
<td><p>18</p></td>
<td><p>aygıt denetimi 2</p></td>
</tr>
<tr class="row-odd"><td><p>3</p></td>
<td><p>metin sonu</p></td>
<td><p>19</p></td>
<td><p>aygıt denetimi 3</p></td>
</tr>
<tr class="row-even"><td><p>4</p></td>
<td><p>aktarım sonu</p></td>
<td><p>20</p></td>
<td><p>aygıt denetimi 4</p></td>
</tr>
<tr class="row-odd"><td><p>5</p></td>
<td><p>sorgu</p></td>
<td><p>21</p></td>
<td><p>olumsuz bildirim</p></td>
</tr>
<tr class="row-even"><td><p>6</p></td>
<td><p>bildirim</p></td>
<td><p>22</p></td>
<td><p>zaman uyumlu boşta kalma</p></td>
</tr>
<tr class="row-odd"><td><p>7</p></td>
<td><p>zil</p></td>
<td><p>23</p></td>
<td><p>aktarım bloğu sonu</p></td>
</tr>
<tr class="row-even"><td><p>8</p></td>
<td><p>geri al</p></td>
<td><p>24</p></td>
<td><p>iptal</p></td>
</tr>
<tr class="row-odd"><td><p>9</p></td>
<td><p>yatay sekme</p></td>
<td><p>25</p></td>
<td><p>ortam sonu</p></td>
</tr>
<tr class="row-even"><td><p>10</p></td>
<td><p>satır besleme/yeni satır</p></td>
<td><p>26</p></td>
<td><p>değiştir</p></td>
</tr>
<tr class="row-odd"><td><p>11</p></td>
<td><p>dikey sekme</p></td>
<td><p>27</p></td>
<td><p>çık</p></td>
</tr>
<tr class="row-even"><td><p>12</p></td>
<td><p>form besleme/yeni sayfa</p></td>
<td><p>28</p></td>
<td><p>dosya ayırıcısı</p></td>
</tr>
<tr class="row-odd"><td><p>13</p></td>
<td><p>satır başı</p></td>
<td><p>29</p></td>
<td><p>grup ayırıcısı</p></td>
</tr>
<tr class="row-even"><td><p>14</p></td>
<td><p>dışarı kaydır</p></td>
<td><p>30</p></td>
<td><p>kayıt ayırıcısı</p></td>
</tr>
<tr class="row-odd"><td><p>15</p></td>
<td><p>içeri kaydır</p></td>
<td><p>31</p></td>
<td><p>birim ayırıcısı</p></td>
</tr>
</tbody>
</table>
</div></blockquote>
<p>Gördüğünüz gibi, bunlar birer harf, sayı veya noktalama işareti değil. O yüzden
bu karakterler ekranda görünmez. Ama bir metindeki veri, satır ve paragraf
düzeninin nasıl olacağını, metnin nerede başlayıp nerede biteceğini ve nasıl
görüneceğini kontrol ettikleri için önemlidirler.</p>
<p>Geri kalan sayılar ise doğrudan karakterlere, sayılara ve noktalama işaretlerine
tahsis edilmiştir:</p>
<blockquote>
<div><table class="docutils align-default">
<colgroup>
<col style="width: 9%" />
<col style="width: 15%" />
<col style="width: 9%" />
<col style="width: 15%" />
<col style="width: 11%" />
<col style="width: 17%" />
<col style="width: 9%" />
<col style="width: 15%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
<th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
<th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
<th class="head"><p>sayı</p></th>
<th class="head"><p>karakter</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>32</p></td>
<td><p>‘ ‘</p></td>
<td><p>33</p></td>
<td><p>‘!’</p></td>
<td><p>34</p></td>
<td><p>‘”’</p></td>
<td><p>35</p></td>
<td><p>‘#’</p></td>
</tr>
<tr class="row-odd"><td><p>36</p></td>
<td><p>‘$’</p></td>
<td><p>37</p></td>
<td><p>‘%’</p></td>
<td><p>38</p></td>
<td><p>‘&’</p></td>
<td><p>39</p></td>
<td><p>“’”</p></td>
</tr>
<tr class="row-even"><td><p>40</p></td>
<td><p>‘(‘</p></td>
<td><p>41</p></td>
<td><p>‘)’</p></td>
<td><p>42</p></td>
<td><p>‘*’</p></td>
<td><p>43</p></td>
<td><p>‘+’</p></td>
</tr>
<tr class="row-odd"><td><p>44</p></td>
<td><p>‘,’</p></td>
<td><p>45</p></td>
<td><p>‘-‘</p></td>
<td><p>46</p></td>
<td><p>‘.’</p></td>
<td><p>47</p></td>
<td><p>‘/’</p></td>
</tr>
<tr class="row-even"><td><p>48</p></td>
<td><p>‘0’</p></td>
<td><p>49</p></td>
<td><p>‘1’</p></td>
<td><p>50</p></td>
<td><p>‘2’</p></td>
<td><p>51</p></td>
<td><p>‘3’</p></td>
</tr>
<tr class="row-odd"><td><p>52</p></td>
<td><p>‘4’</p></td>
<td><p>53</p></td>
<td><p>‘5’</p></td>
<td><p>54</p></td>
<td><p>‘6’</p></td>
<td><p>55</p></td>
<td><p>‘7’</p></td>
</tr>
<tr class="row-even"><td><p>56</p></td>
<td><p>‘8’</p></td>
<td><p>57</p></td>
<td><p>‘9’</p></td>
<td><p>58</p></td>
<td><p>‘:’</p></td>
<td><p>59</p></td>
<td><p>‘;’</p></td>
</tr>
<tr class="row-odd"><td><p>60</p></td>
<td><p>‘<’</p></td>
<td><p>61</p></td>
<td><p>‘=’</p></td>
<td><p>62</p></td>
<td><p>‘>’</p></td>
<td><p>63</p></td>
<td><p>‘?’</p></td>
</tr>
<tr class="row-even"><td><p>64</p></td>
<td><p>‘@’</p></td>
<td><p>65</p></td>
<td><p>‘A’</p></td>
<td><p>66</p></td>
<td><p>‘B’</p></td>
<td><p>67</p></td>
<td><p>‘C’</p></td>
</tr>
<tr class="row-odd"><td><p>68</p></td>
<td><p>‘D’</p></td>
<td><p>69</p></td>
<td><p>‘E’</p></td>
<td><p>70</p></td>
<td><p>‘F’</p></td>
<td><p>71</p></td>
<td><p>‘G’</p></td>
</tr>
<tr class="row-even"><td><p>72</p></td>
<td><p>‘H’</p></td>
<td><p>73</p></td>
<td><p>‘I’</p></td>
<td><p>74</p></td>
<td><p>‘J’</p></td>
<td><p>75</p></td>
<td><p>‘K’</p></td>
</tr>
<tr class="row-odd"><td><p>76</p></td>
<td><p>‘L’</p></td>
<td><p>77</p></td>
<td><p>‘M’</p></td>
<td><p>78</p></td>
<td><p>‘N’</p></td>
<td><p>79</p></td>
<td><p>‘O’</p></td>
</tr>
<tr class="row-even"><td><p>80</p></td>
<td><p>‘P’</p></td>
<td><p>81</p></td>
<td><p>‘Q’</p></td>
<td><p>82</p></td>
<td><p>‘R’</p></td>
<td><p>83</p></td>
<td><p>‘S’</p></td>
</tr>
<tr class="row-odd"><td><p>84</p></td>
<td><p>‘T’</p></td>
<td><p>85</p></td>
<td><p>‘U’</p></td>
<td><p>86</p></td>
<td><p>‘V’</p></td>
<td><p>87</p></td>
<td><p>‘W’</p></td>
</tr>
<tr class="row-even"><td><p>88</p></td>
<td><p>‘X’</p></td>
<td><p>89</p></td>
<td><p>‘Y’</p></td>
<td><p>90</p></td>
<td><p>‘Z’</p></td>
<td><p>91</p></td>
<td><p>‘[‘</p></td>
</tr>
<tr class="row-odd"><td><p>92</p></td>
<td><p>‘\’</p></td>
<td><p>93</p></td>
<td><p>‘]’</p></td>
<td><p>94</p></td>
<td><p>‘^’</p></td>
<td><p>95</p></td>
<td><p>‘_’</p></td>
</tr>
<tr class="row-even"><td><p>96</p></td>
<td><p>‘’’</p></td>
<td><p>97</p></td>
<td><p>‘a’</p></td>
<td><p>98</p></td>
<td><p>‘b’</p></td>
<td><p>99</p></td>
<td><p>‘c’</p></td>
</tr>
<tr class="row-odd"><td><p>100</p></td>
<td><p>‘d’</p></td>
<td><p>101</p></td>
<td><p>‘e’</p></td>
<td><p>102</p></td>
<td><p>‘f’</p></td>
<td><p>103</p></td>
<td><p>‘g’</p></td>
</tr>
<tr class="row-even"><td><p>104</p></td>
<td><p>‘h’</p></td>
<td><p>105</p></td>
<td><p>‘i’</p></td>
<td><p>106</p></td>
<td><p>‘j’</p></td>
<td><p>107</p></td>
<td><p>‘k’</p></td>
</tr>
<tr class="row-odd"><td><p>108</p></td>
<td><p>‘l’</p></td>
<td><p>109</p></td>
<td><p>‘m’</p></td>
<td><p>110</p></td>
<td><p>‘n’</p></td>
<td><p>111</p></td>
<td><p>‘o’</p></td>
</tr>
<tr class="row-even"><td><p>112</p></td>
<td><p>‘p’</p></td>
<td><p>113</p></td>
<td><p>‘q’</p></td>
<td><p>114</p></td>
<td><p>‘r’</p></td>
<td><p>115</p></td>
<td><p>‘s’</p></td>
</tr>
<tr class="row-odd"><td><p>116</p></td>
<td><p>‘t’</p></td>
<td><p>117</p></td>
<td><p>‘u’</p></td>
<td><p>118</p></td>
<td><p>‘v’</p></td>
<td><p>119</p></td>
<td><p>‘w’</p></td>
</tr>
<tr class="row-even"><td><p>120</p></td>
<td><p>‘x’</p></td>
<td><p>121</p></td>
<td><p>‘y’</p></td>
<td><p>122</p></td>
<td><p>‘z’</p></td>
<td><p>123</p></td>
<td><p>‘{‘</p></td>
</tr>
<tr class="row-odd"><td><p>124</p></td>
<td><p>‘|’</p></td>
<td><p>125</p></td>
<td><p>‘}’</p></td>
<td><p>126</p></td>
<td><p>‘~’</p></td>
<td><p>127</p></td>
<td><p>‘x7f’</p></td>
</tr>
</tbody>
</table>
</div></blockquote>
<p>İşte 32 ile 127 arası sayılarla eşleştirilen yukarıdaki karakterler yardımıyla
metin ihtiyaçlarımızın büyük bölümünü karşılayabiliriz. Yani ASCII adı verilen
bu eşleştirme tablosu sayesinde bilgisayarların sayılarla birlikte karakterleri
de işleyebilmesini sağlayabiliriz.</p>
<p>1960’lı yıllara gelindiğinde, bilgisayarlar 8 bit uzunluğundaki verileri
işleyebiliyordu. Yani, ASCII sisteminin gerçeklendiği (yani hayata geçirildiği)
bilgisayarlar 8 bitlik bir kapasiteye sahipti. Bu 8 bitin 7 biti karakterle
ayrılmıştı. Dolayısıyla mevcut bütün karakterler 7 bitlik bir alana
sığdırılmıştı. Boşta kalan <cite>8.</cite> bit ise, veri aktarımının düzgün
gerçekleştirilip gerçekleştirilmediğini denetlemek amacıyla ‘doğruluk kontrolü’
için kullanılıyordu. Bu kontrole teknik olarak ‘eşlik denetimi’ (<em>parity
check</em>), bu eşlik denetimini yapmamızı sağlayan bit’e ise ‘eşlik biti’ (<em>parity
bit</em>) adı verildiğini biliyorsunuz. Geçen bölümde bu teknik terimlerin ne anlama
geldiğini açıklamış, hatta bunlarla ilgili basit bir örnek de vermiştik.</p>
<p>Adından da anlaşılacağı gibi, ASCII bir Amerikan standardıdır. Dolayısıyla
hazırlanışında İngilizce temel alınmıştır. Zaten ASCII tablosunu
incelediğinizde, bu tabloda Türkçeye özgü harflerin bulunmadığını göreceksiniz.
Bu sebepten, bu standart ile mesela Türkçeye özgü karakterleri gösteremeyiz.
Çünkü ASCII standardında ‘ş’, ‘ç’, ‘ğ’ gibi harfler kodlanmamıştır. Özellikle
Python’ın 2.x serisini kullanmış olanlar, ASCII’nin bu yetersizliğinin nelere
sebep olduğunu gayet iyi bilir. Python’ın 2.x serisinde mesela doğrudan şöyle
bir kod yazamayız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="s2">"Merhaba Şirin Baba!"</span><span class="p">)</span>
</pre></div>
</div>
<p><cite>“Merhaba Şirin Baba!</cite> adlı karakter dizisinde geçen ‘Ş’ harfi ASCII dışı bir
karakterdir. Yani bu harf ASCII ile temsil edilemez. O yüzden böyle bir kod
yazıp bu kodu çalıştırdığımızda Python bize şöyle bir hata mesajı
gösterecektir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span> <span class="n">File</span> <span class="s2">"deneme.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span>
<span class="ne">SyntaxError</span><span class="p">:</span> <span class="n">Non</span><span class="o">-</span><span class="n">ASCII</span> <span class="n">character</span> <span class="s1">'</span><span class="se">\xde</span><span class="s1">'</span> <span class="ow">in</span> <span class="n">file</span> <span class="n">deneme</span><span class="o">.</span><span class="n">py</span> <span class="n">on</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="n">but</span> <span class="n">no</span>
<span class="n">encoding</span> <span class="n">declared</span><span class="p">;</span> <span class="n">see</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">python</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">peps</span><span class="o">/</span><span class="n">pep</span><span class="o">-</span><span class="mf">0263.</span><span class="n">html</span> <span class="k">for</span> <span class="n">details</span>
</pre></div>
</div>
<p>Aynen anlattığımız gibi, yukarıdaki hata mesajı da kodlar arasında ASCII olmayan
bir karakter yer aldığından yakınıyor…</p>
<p>ASCII’nin her ne kadar yukarıda bahsettiğimiz eksiklikleri olsa da bu standart
son derece yaygındır ve piyasada bulunan pek çok sistemde kullanılmaya devam
etmektedir. Örneğin size kullanıcı adı ve parola soran hemen hemen bütün
sistemler bu ASCII tablosunu temel alır veya bu tablodan etkilenmiştir. O yüzden
çoğu yerde kullanıcı adı ve/veya parola belirlerken Türkçe karakterleri
kullanamazsınız. Hatta pek çok yazı tipinde yalnızca ASCII tablosunda yer alan
karakterlerin karşılığı bulunur. Bu yüzden, mesela blogunuzda kullanmak üzere
seçip beğendiğiniz çoğu yazı tipi ‘ş’, ‘ç’, ‘ğ’, ‘ö’ gibi harfleri
göstermeyebilir. Yukarıda ‘Merhaba Şirin Baba!’ örneğinde de gösterdiğimiz gibi,
Python’ın 2.x serisinde de öntanımlı olarak ASCII kodlama biçimi kullanılıyordu.
O yüzden Python’ın 2.x sürümlerinde Türkçe karakterleri gösterebilmek için daha
fazla ilave işlem yapmak zorunda kalıyorduk.</p>
<p>Sözün özü, eğer yazdığınız veya kendiniz yazmamış da olsanız herhangi bir
sebeple kullanmakta olduğunuz bir programda Türkçe karakterlere ilişkin bir hata
alıyorsanız, bu durumun en muhtemel sebebi, kullandığınız programın veya
sistemin, doğrudan ASCII’yi veya ASCII’ye benzer başka bir sistemi temel alarak
çalışıyor olmasıdır. ASCII tablosunda görünen 128 karakter dışında kalan hiçbir
karakter ASCII ile kodlanamayacağı için, özellikle farklı dillerin kullanıldığı
bilgisayarlarda çalışan programlar kaçınılmaz olarak karakterlere ilişkin pek
çok hata verecektir. Örneğin, karakter kodlamalarına ilişkin olarak yukarıda
bahsettiğimiz ayrıntılardan habersiz bir Amerikalı programcının yazdığı bir
programa Türkçe veri girdiğinizde bu program bir anda tuhaf görünen hatalar
verip çökecektir…</p>
</div>
<div class="section" id="genisletilmis-ascii">
<h3>Genişletilmiş ASCII<a class="headerlink" href="#genisletilmis-ascii" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Dediğimiz gibi, ASCII 7 bitlik bir karakter kümesidir. Bu standardın ilk çıktığı
dönemde 8. bitin hata kontrolü için kullanıldığını söylemiştik. Sonraki yıllarda
8. bitin hata kontrolü için kullanılmasından vazgeçildi. Böylece 8. bit yine
boşa düşmüş oldu. Bu bitin boşa düşmesi ile elimizde yine toplam <cite>128</cite>
karakterlik bir boşluk olmuş oldu. Dediğimiz gibi 7 bit ile toplam <cite>128</cite>
sayı-karakter eşleştirilebilirken, 8 bit ile toplam <cite>256</cite> sayı-karakter
eşleştirilebilir. Ne de olsa:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mi">2</span><span class="o">**</span><span class="mi">7</span>
<span class="go">128</span>
<span class="gp">>>> </span><span class="mi">2</span><span class="o">**</span><span class="mi">8</span>
<span class="go">256</span>
</pre></div>
</div>
<p>İşte bu fazla bit, farklı kişi, kurum ve organizasyonlar tarafından, İngilizcede
bulunmayan ama başka dillerde bulunan karakterleri temsil etmek için kullanıldı.
Ancak elbette bu fazladan bitin sağladığı <cite>128</cite> karakter de dünyadaki bütün
karakterlerin temsil edilmesine yetmez. Bu yüzden 8. bitin sunduğu boşluk,
birbirinden farklı karakterleri gösteren çeşitli tabloların ortaya çıkmasına
sebep oldu. Bu birbirinden farklı tablolara genel olarak ‘kod sayfası’ adı
verilir. Örneğin Microsoft şirketinin Türkiye’ye gönderdiği bilgisayarlarda
tanımlı ‘cp857’ adlı kod sayfasında 128 ile 256 aralığında Türkçe karakterlere
de yer verilmişti (bkz. <a class="reference external" href="http://msdn.microsoft.com/en-us/library/cc195068.aspx">http://msdn.microsoft.com/en-us/library/cc195068.aspx</a>)</p>
<p>Bu tabloya baktığınızda baştan 128’e kadar olan karakterlerin standart ASCII
tablosu ile aynı olduğunu göreceksiniz. 128. karakterden itibaren ise Türkçeye
özgü harfler tanımlanır. Mesela bu tabloda 128. karakter Türkçedeki büyük ‘ç’
harfi iken, 159. karakter küçük ‘ş’ harfidir. Bu durumu şu Python kodları ile de
teyit edebilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s2">"Ç"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"cp857"</span><span class="p">)</span>
<span class="go">b'\x80'</span>
<span class="gp">>>> </span><span class="s2">"ş"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"cp857"</span><span class="p">)</span>
<span class="go">b'\x9f'</span>
</pre></div>
</div>
<p>Bu arada bu sayıların onaltılı sayma düzenine göre olduğunu biliyorsunuz. Onlu
düzende bunların karşılığı sırasıyla şudur:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">int</span><span class="p">(</span><span class="s2">"80"</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
<span class="go">128</span>
<span class="gp">>>> </span><span class="nb">int</span><span class="p">(</span><span class="s2">"9f"</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
<span class="go">159</span>
</pre></div>
</div>
<p>Burada karakter dizilerinin <code class="docutils literal notranslate"><span class="pre">encode()</span></code> adlı metodunu kullandığımıza dikkat
edin. Bu metot yardımıyla herhangi bir karakteri herhangi bir karakter kodlama
sistemine göre kodlayabiliriz. Mesela yukarıdaki iki örnekte ‘Ç’ ve ‘ş’
harflerini ‘cp857’ adlı kod sayfasına göre kodladık ve bunların bu kod
sayfasında hangi sayılara karşılık geldiğini bulduk.</p>
<p>cp857 numaralı kod sayfasında ‘Ç’ ve ‘ş’ harfleri yer aldığı için, biz bu
harfleri o kod sayfasına göre kodlayabiliyoruz. Ama mesela ASCII kodlama
sisteminde bu harfler bulunmaz. O yüzden bu harfleri ASCII sistemine göre
kodlayamayız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s2">"Ç"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"ascii"</span><span class="p">)</span>
<span class="gt">Traceback (most recent call last):</span>
<span class="n">File</span> <span class="s2">"<stdin>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o"><</span><span class="n">module</span><span class="o">></span>
<span class="gr">UnicodeEncodeError</span>: <span class="n">'ascii' codec can't encode character '\xc7' in position</span>
<span class="go">0: ordinal not in range(128)</span>
</pre></div>
</div>
<p>Tıpkı hata mesajında da söylendiği gibi:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>Unicode Kodlama Hatası: 'ascii' kod çözücüsü, 0 konumundaki '\xc7' adlı
karakteri kodlayamıyor. Sayı 0-128 aralığında değil.
</pre></div>
</div>
<p>Gerçekten de onlu sistemde <cite>199</cite> sayısına karşılık gelen bu onaltılı ‘\xc7’
sayısı ASCII’nin kapsadığı sayı aralığının dışında kalmakta, bu yüzden de ASCII
kod çözücüsü ile kodlanamamaktadır.</p>
<p>Dediğimiz gibi, Microsoft Türkiye’ye gönderdiği bilgisayarlarda 857 numaralı kod
sayfasını tanımlıyordu. Ama mesela Arapça konuşulan ülkelere gönderdiği
bilgisayarlarda ise, <a class="reference external" href="http://msdn.microsoft.com/en-us/library/cc195061.aspx">http://msdn.microsoft.com/en-us/library/cc195061.aspx</a>
adresinden görebileceğiniz 708 numaralı kod sayfasını tanımlıyordu. Bu kod
sayfasını incelediğinizde, 128 altı karakterlerin standart ASCII ile aynı
olduğunu ancak 128 üstü karakterlerin Türkçe kod sayfasındaki karakterlerden
farklı olduğunu göreceksiniz. İşte 128 üstü karakterler bütün dillerde
birbirinden farklıdır. Bu farklılığın ne sonuç doğurabileceğini tahmin
edebildiğinizi zannediyorum. Elbette, mesela kendi bilgisayarınızda yazdığınız
bir metni Arapça konuşulan bir ülkedeki bilgisayara gönderdiğinizde, doğal
olarak metin içindeki Türkçeye özgü karakterlerin yerinde başka karakterler
belirecektir.</p>
<p>Bu bölümün başında da söylediğimiz gibi, Genişletilmiş ASCII sisteminde 128 ile
256 aralığı için pek çok farklı karakter eşleştirme tabloları kullanılıyordu.
Mesela Microsoft şirketi bu aralık için kendine özgü birtakım kod sayfaları
tasarlamıştı. Bu kod sayfalarına örnek olarak yukarıda cp857 ve cp708 numaralı
kod sayfalarını örnek vermiştik.</p>
<p>Elbette 128 ile 256 aralığını dolduran, yalnızca Microsoft’a ait kod sayfaları
yoktu piyasada. Aynı aralığı farklı karakterlerle dolduran pek çok başka
eşleştirme tablosu da dolaşıyordu etrafta. Örneğin özellikle Batı Avrupa
dillerindeki karakterleri temsil edebilmek için oluşturulmuş ‘latin1’ (öbür
adıyla ISO-8859-1) adlı karakter kümesi bugün de yaygın olarak kullanılan
sistemlerinden biridir. Almancada olup da ASCII sistemi ile temsil edilemeyen
‘ö’, ‘ß’, ‘ü’ gibi harfler ve Fransızcada olup da yine ASCII sistemi ile temsil
edilemeyen ‘ç’ ve ‘é’ gibi harfler bu karakter kümesinde temsil edilebiliyordu.
Eğer dilerseniz bu karakter kümesini de
<a class="reference external" href="http://www.fileformat.info/info/charset/ISO-8859-1/list.htm">http://www.fileformat.info/info/charset/ISO-8859-1/list.htm</a> adresinden
inceleyebilirsiniz.</p>
<p>Yalnız burada önemli bir ayrıntıyı not düşelim. ‘Genişletilmiş ASCII’, standart
ASCII gibi genel kabul görmüş tek bir sistem değildir.Genişletilmiş ASCII
dediğimizde zaten tek bir karakter kümesi akla gelmiyor. Dolayısıyla ASCII
dendiğinde anlamamız gereken şey 128 karakterlik bir sayı-karakter eşleştirme
tablosudur. ASCII hiçbir zaman bu 128 karakterin ötesine geçip de 256
karakterlik bir aralığı temsil etmiş değildir. Dolayısıyla 127. sayının
ötesindeki karakterleri kapsayan sistem ASCII değildir. ‘Genişletilmiş ASCII’
kavramı, temel ASCII sisteminde temsil edilen sayı-karakter çiftlerinin pek çok
farklı kurum ve kuruluş tarafından birbirinden farklı biçimlerde
‘genişletilmesiyle’ oluşturulmuş, ancak ASCII’nin kendisi kadar
standartlaşamamış bir sistemler bütünüdür. Bu sistem içinde pek çok farklı kod
sayfası (veya karakter kümesi) yer alır. Tek başına ‘Genişletilmiş ASCII’
ifadesi açıklayıcı olmayıp; ASCII’nin hangi karakter kümesine göre
genişletildiğinin de belirtilmesi gerekir.</p>
<p>Bütün bu anlattıklarımızdan şu sonucu çıkarıyoruz: ASCII bilgisayarlar arasında
güvenli bir şekilde veri aktarımını sağlamak için atılmış en önemli ve en
başarılı adımlardan bir tanesidir. Bu güçlü standart sayesinde uzun yıllar
bilgisayarlar arası temel iletişim başarıyla sağlandı. Ancak bu standardın zayıf
kaldığı nokta 7 bitlik olması ve boşta kalan 8. bitin tek başına dünyadaki bütün
dilleri temsil etmeye yeterli olmamasıdır.</p>
</div>
<div class="section" id="karakter-1-bayt">
<h3>1 Karakter == 1 Bayt<a class="headerlink" href="#karakter-1-bayt" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>ASCII standardı, her karakterin 1 bayt ile temsil edilebileceği varsayımı
üzerine kurulmuştur. Bildiğiniz gibi, 1 bayt (geleneksel olarak) 8 bit’e
karşılık gelir. Peki 1 bayt’ın 8 bit’e karşılık gelmesinin nedeni nedir? Aslında
bunun özel bir nedeni yok. 1 destede neden 10 öğe, 1 düzinede de 12 öğe varsa, 1
bayt’ta da 8 bit vardır… Yani biz insanlar öyle olmasına karar verdiğimiz için
1 destede 10 öğe, 1 düzinede 12 öğe, 1 bayt’ta ise 8 bit vardır.</p>
<p>Dediğimiz gibi ASCII standardı 7 bitlik bir sistemdir. Yani bu standartta en
büyük sayı olan 127 yalnızca 7 bit ile gösterilebilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">bin</span><span class="p">(</span><span class="mi">127</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
<span class="go">'1111111'</span>
</pre></div>
</div>
<p>127 sayısı 7 bit ile gösterilebilecek son sayıdır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="p">(</span><span class="mi">127</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span>
<span class="go">7</span>
<span class="gp">>>> </span><span class="p">(</span><span class="mi">128</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span>
<span class="go">8</span>
</pre></div>
</div>
<p>8 bitlik bir sistem olan Genişletilmiş ASCII ise 0 ile 255 arası sayıları temsil
edebilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">bin</span><span class="p">(</span><span class="mi">255</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
<span class="go">'11111111'</span>
</pre></div>
</div>
<p>255 sayısı 8 bit ile gösterilebilecek son sayıdır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span>
<span class="go">8</span>
<span class="gp">>>> </span><span class="p">(</span><span class="mi">256</span><span class="p">)</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span>
<span class="go">9</span>
</pre></div>
</div>
<p>Dolayısıyla ASCII’de ve Genişletilmiş ASCII’de 1 baytlık alana toplam 256
karakter sığdırılabilir. Eğer daha fazla karakteri temsil etmek isterseniz 1
bayttan fazla bir alana ihtiyaç duyarsınız.</p>
<p>Bu arada, olası bir yanlış anlamayı önleyelim:</p>
<p>1 bayt olma durumu mesela doğrudan ‘a’ harfinin kendisi ile ilgili bir şey
değildir. Yani ‘a’ harfi 1 bayt ile gösterilebiliyorken, mesela ‘ş’ harfi 1 bayt
ile gösterilemiyorsa, bunun nedeni ‘ş’ harfininin ‘tuhaf bir harf’ olması
değildir! Eğer ASCII gibi bir sistem Türkiye’de tasarlanmış olsaydı, herhalde
‘ş’ harfi ilk 128 sayı arasında kendine bir yer bulurdu. Mesela böyle bir
sistemde muhtemelen ‘x’, ‘w’ ve ‘q’ harfleri, Türk alfabesinde yer almadıkları
için, dışarıda kalırdı. O zaman da ‘ş’, ‘ç’, ‘ğ’ gibi harflerin 1 bayt olduğunu,
‘x’, ‘w’ ve ‘q’ gibi harflerin ise 1 bayt olmadığını söylerdik.</p>
</div>
</div>
<div class="section" id="unicode">
<h2>UNICODE<a class="headerlink" href="#unicode" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>İlk bilgisayarların ABD çıkışlı olması nedeniyle, bilgisayarlar çoğunlukla
ABD’de üretilip ABD pazarına satılıyordu. Bu nedenle İngilizce alfabeyi temel
alan ASCII gibi bir sistem bu pazarın karakter temsil ihtiyaçlarını %99 oranında
karşılıyordu. Ancak bilgisayarların ABD dışına çıkması ve ABD dışında da da
yayılmaya başlamasının ardından, ASCII’nin yetersizlikleri de iyice görünür
olmaya başladı. Çünkü ASCII tablosunda, İngilizce dışındaki dillerde bulunan
aksanlı ve noktalı harflerin (é, ä, ö, ç gibi) hiçbiri bulunmuyordu.</p>
<p>İlk zamanlarda insanlar aksanlı ve noktalı harfleri ASCII tablosundaki
benzerleriyle değiştirerek kullanmaya razı olmuşlardı (é yerine e; ä yerine a; ö
yerine o; ç yerine c gibi). Ancak bu çözüm Avrupa dillerini kullananların
sorununu kısmen çözüyor da olsa, Asya dillerindeki problemi çözemez. Çünkü ASCII
tablosunu kullanarak Çince ve Japonca gibi dillerdeki karakterleri herhangi bir
şekilde temsil etmeniz mümkün değildir.</p>
<p>Bu sıkıntıyı kısmen de olsa giderebilmek için, yukarıda da bahsetmiş olduğumuz,
128-256 arasındaki boşluktan yararlanılmaya başlandı. Dediğimiz gibi, ASCII 7
bitlik bir sistem olduğu için, 8 bitlik bilgisayarlarda fazladan 1 bitin boşta
kalmasına izin verir. İşte bu 1 bitlik boşluk dünyanın çeşitli ülkeleri
tarafından kendi karakter ihtiyaçlarını karşılamak için kullanıldı. Dolayısıyla
Almanlar 128-256 arasını farklı karakterlerle, Fransızlar başka karakterlerle,
Yunanlar ise bambaşka karakterlerle doldurdular.</p>
<p>Hatırlarsanız ASCII’nin ortaya çıkış sebebi bilgisayarlar arasında veri
alışverişini mümkün kılmaktı. ASCII Amerika’daki bilgisayarlar arasında sağlıklı
bir veri alışverişi gerçekleştirilmesini rahatlıkla mümkün kılıyordu. Ama
bilgisayarların dünyaya yayılması ile birlikte ilk baştaki veri aktarımı
problemi tekrar ortaya çıktı. Bu defa da, mesela Türkiye’den gönderilen bir
metin (örneğin bir e.posta) Almanya’daki bilgisayarlarda düzgün
görüntülenemeyebiliyordu. Örneğin Windows-1254 (cp1254) numaralı kod sayfası ile
kodlanmış Türkçe bir metin, Almanya’da Windows-1250 numaralı kod sayfasının