1 Temmuz 2019 Pazartesi

American Standard Code for Information Interchange - ASCII

Tarihçesi
Açıklaması şöyle
ASCII only became an international standard when ECMA, the European Computer Manufacturers Association, recommended an ASCII based international variant in 1965 ...
ASCII Tablosu
ASCII karakterler 0 - 127 arasında değer alırlar. Yazdırılabilen karakterler (Printable Characters) 32-126 arasındadır. 0-31, ve 127 kontrol karakterleri olarak kullanılır. 127'nin diğer kontrol karakterlerinden ayrı olması ilginç bir şey. Vakti zamanında IBM tarafından üretilen EBCDIC, ASCII'nin rakibiydi. EBCDIC halen IBM mainframe'lerinde kullanılıyor.

EBCDIC yazısına bakabilirsiniz.

OEM Character Set
Açıklaması şöyle
The IBM-PC had something that came to be known as the OEM character set which provided some accented characters for European languages and a bunch of line drawing characters
Code Pages
Açıklaması şöyle. OEM Character Set daha sonra standart hale gelmeye başladı. 128'den büyük karakterin ne olacağı code page ile belirleniyordu.
Eventually this OEM free-for-all got codified in the ANSI standard. In the ANSI standard, everybody agreed on what to do below 128, which was pretty much the same as ASCII, but there were lots of different ways to handle the characters from 128 and on up, depending on where you lived. These different systems were called code pages. So for example in Israel DOS used a code page called 862, while Greek users used 737. They were the same below 128 but different from 128 up, where all the funny letters resided. The national versions of MS-DOS had dozens of these code pages, handling everything from English to Icelandic and they even had a few “multilingual” code pages that could do Esperanto and Galician on the same computer! Wow! But getting, say, Hebrew and Greek on the same computer was a complete impossibility unless you wrote your own custom program that displayed everything using bitmapped graphics, because Hebrew and Greek required different code pages with different interpretations of the high numbers.
ASCII Bit Trick'leri
Büyük ve küçük harfler arasında 32 fark var. Büyük A karakterinin değerine 32 eklersek küçük a karakterini elde ederiz.
Örnek
XOR^32 kullanarak yaparız.
string str = "...";
for (int i = 0; i < str.length(); i++)
  str[i] ^= 32;
Örnek
XOR^32 kullanarak şöyle yaparız.
char foo = 'a';
foo ^= 32;
char bar = 'A';
bar ^= 32;
cout << foo << ' ' << bar << '\n'; // foo is A, and bar is a
Gösterilmeyen (NonPrintable) Karakterler
Decimal 8 
Bütün programlama dillerinde '\b' ile temsil edilir.
Backspace olarak adlandırılmasına rağmen bence "sol ok" gibi çalışıyor.

Örnek 1
Şöyle yaparız.
#include <stdio.h>

main ()
{
  printf("hello worl\b\bd\n");
}
Çıktı olarak şunu verir
hello wodl
Örnek 2
Şöyle yaparız.
#include <iostream>
#include <string>
#include <thread>

using namespace std;

int main() {
  string cycle = "|/-\\";
  int i = 0;

  cout << "Loading... ";

  while (true) {
    // Print current character
    cout << cycle[i];

    // Sleep for 0.25 seconds
    this_thread::sleep_for(chrono::milliseconds(250));

    // Delete last character, then increase counter.
    cout << "\b";
    i = ++i % 4;
  }
}
Çıktı olarak şunu verir
Loading... ve değişimli olarak |,/,-,\
Decimal 17 DC1 - Continue
Ctrl+Q ile gönderilir. Terminale veri göndermeye devam edilir. RS232 için açıklaması şöyle.
Ctrl-S and Ctrl-Q are simply XON and XOFF in ASCII.
Decimal 18 DC2
Ctrl + R ile gönderilir.

Decimal 19 DC3 - Stop
Ctrl + S ile gönderilir. Terminale veri gönderme durdurulur. RS232 için açıklaması şöyle.
Ctrl-S and Ctrl-Q are simply XON and XOFF in ASCII.

Decimal 20 DC4
Ctrl + T ile gönderilir.

Decimal 25 - EM
End Of Medium anlamına gelir. Bu karakter punch card devrinden kalma. Açıklaması şöyle
EM (End of Media)
The EM control character is used to indicate the end of a record when transmitting
records of variable length. The EM character is punched in the card column following the
last column containing data. When the EM character is read from a card it prevents
further reading of that card. The transmitting 2780 then generates automatically and
an end-of-record (US or IUS in EBCDIC), or end-of-block (ETB) character following
the EM character. 
Decimal 26 SUB
Bu karakter Windows'ta Ctrl + Z ile temsil edilir. Eğer binary bir dosya metin modunda açılırsa, Windows'taki C Runtime bu karakteri EOF olarak yorumlar.

Decimal 31
ASCII 31 Unit Separator karakteridir. Print edilemeyen kontrol karakterlerine dahildir. Vi'da ^_ ile gösterilir.

Gösterilen (Printable) Karakterler
98 - hex 0X60
Grave Accent (Aksan işareti) olarak adlandırılan karakterdir` şeklinde gösterilir, yani sola yatıktır.
Türkçe ve İngilizce'de kullanılmadığı için pek karşımıza çıkmaz. Apostrof'tan farklıdır.

C++ Kodlama
C++'ta Encoding sınıfları yok. ASCII ile çalışması sağlayan metodlar var. Bu metodlar cctype header dosyasında tanımlı.

isspace metodu
std::isspace metodu yazısına taşıdım

isprint metodu
std::isprint metodu yazısına taşıdım

isalpha metodu
std::isalpha metodu yazısına taşıdım

C# Kodlama
Dönüşüm Formülü
Encoding.ASCII sınıfı 7 bitlik ASCII tablosunu kullanır.  Eğer 127'den büyük bir karakter ile karşılaşırsa "?" karakteri döndürür. Örnekte 0xB0 127'den büyük olduğu için string olarak "?-" elde ederiz.
byte[] bytes = { 0xB0, 0x2D };
string str = Encoding.ASCII.GetString(bytes);   // oriInStr ->   "?-"
bytes = Encoding.ASCII.GetBytes(str);           // oriBytes -> 0x3F, 0x2D
Bir başka yöntem
Null terminated ASCII'den Unicode'a Dönüşüm aşağıdaki gibi yapılır
byte[] data = //... null terminated ascii char buffer
BinaryReader reader = new BinaryReader (new MemoryStream (data), Encoding.ASCII);
char[] chars = reader.ReadChars (100);
int index = Array.FindIndex (chars, x=> x == 0);
if (index != -1){
    return new String (chars,0,index);
}

Hiç yorum yok:

Yorum Gönder