BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C örnek kodlar > c_ornek00015

C örnek kodlar

UTF-8 bir karakter dizisi içindeki Türkçe karakterleri çevirme

Program, UTF-8 karakter dizilerindeki Türkçe karakterlerin ekranda normal bir şekilde görüntülenmesini sağlayan kodların kullanılmasını göstermektedir.

Komut satırında karakterlerin düzgün bir şekilde görünmesini sağlamak için, aşağıdaki dosyayı CodeBlocks IDE içinde Settings - Editor menü seçeneğini seçerek "Encoding Settings" sekmesinden Encoding seçeneğini WINDOWS-1254 olarak ayarladıktan sonra kaydetmek gerekir.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h> // Komut göstergesinde Türkçe karakterlerin düzgün bir şekilde gösterilmesi için

void printFile(const char* file);
char *bg_utf8_ISO88599(char *str);
char *bg_replace_substr(const char *str, const char *find, const char *replace);

int main(void)
{
    // Komut göstergesinde Türkçe karakterlerin düzgün bir şekilde gösterilmesi için
	setlocale(LC_ALL, "Turkish");

    printFile("dosya_utf8.txt");

    return 0;
}

void printFile(const char* file)
{
  FILE *fp;
  long int fsize=0, rsize=0;
  char *pfile;
  char *rdizi;

  /* Dosyayı okuma için açma */
  fp=fopen(file, "r");
  /* Dosya sonuna erişme */
  fseek(fp, 0, SEEK_END);
  /* Dosyanın aktif konum yani dosya sonu değerini alma */
  fsize=ftell(fp);

  if(fsize==-1) return;

  /* Dosya aktif konumunu başa alma */
  fseek(fp, 0, SEEK_SET);
  /* Dinamik bellek tahsisi */
  pfile = (char *) malloc((fsize+1) * sizeof(char));
  /* Dosya içeriğini okuma */
  rsize = fread (pfile, sizeof(char), fsize, fp);
  pfile[fsize] = '\0';

  printf("%s", pfile);

  rdizi = bg_utf8_ISO88599(pfile);

  printf("\n\n%s", rdizi);

  /* Dosya kapatma */
  fclose (fp);
  /* Bellek boşaltma */
  free(pfile);
  free(rdizi);
}

char *bg_utf8_ISO88599(char *str)
{
  char *nstr = malloc(strlen(str)+1);
  nstr = str;
  char *sdizi;
  char utf8_char[][3] = { "\xC4\xB1", "\xC3\xBC", "\xC4\x9F", "\xC5\x9F", "\xC3\xA7", "\xC3\xB6", "\xC3\x9C",
                          "\xC4\xB0", "\xC3\x87", "\xC3\x96", "\xC4\x9E", "\xC5\x9E" };
  char tr_char[][2] = { "ı", "ü", "ğ", "ş", "ç", "ö", "Ü", "İ", "Ç", "Ö", "Ğ", "Ş" };
  int id;

  for (id=0; id<12; id++) {
       sdizi = bg_replace_substr(nstr, utf8_char[id], tr_char[id]);
       nstr = realloc(nstr, strlen(sdizi)+1);
       strcpy(nstr, sdizi);
       free(sdizi);
  }

  return nstr;
}

char *bg_replace_substr(const char *str, const char *find, const char *replace)
{
  unsigned find_len, replace_len;
  char *newstr;
  unsigned int newstr_size;      // Yeni oluşturulan karakter dizisinin boyutu
  unsigned int newstr_act = 0;   // Yeni oluşturulan karakter dizisinin aktif konumu
  char *pfind;                   // Değiştirilecek olan karakter dizisinin adresi

  find_len = strlen(find);       // Değiştirilecek olan karakter dizisinin boyutu

  // Ana karakter dizisi veya değiştirilecek karakter dizisi boş ise
  if (!strlen(str) || !find_len) return NULL;

  replace_len = strlen(replace);
  newstr_size = strlen(str) + 1;
  newstr = malloc(newstr_size);

  while ((pfind = strstr(str, find))) {
     // Bulunan karakter dizisine kadar olan karakterleri newstr belleğine kopyalama
     memcpy(newstr + newstr_act, str, pfind - str);
     // Bulunan karakter dizisinin başlangıç adresinin
     // orjinal str işaretçisi ile olan farkını newstr_act değerine ekleme
     newstr_act += pfind - str;
     // Orjinal karakter dizisi adresini, bulunan karakter dizisinin adresinden
     // find uzunluğu kadar ileri alma
     str = pfind + find_len;
     // Yeni oluşturulan karakter dizisine eklenecek veya çıkarılacak olan karakter
     // sayısına göre newstr_size boyutunu hesaplama
     newstr_size = newstr_size - find_len + replace_len;
     // Yeni oluşturulan karakter dizisinin bellek ayırma işlemini yenileme
     newstr = realloc(newstr, newstr_size);
     // replace karakter dizisini newstr dizisine ekleme
     memcpy(newstr + newstr_act, replace, replace_len);
     // newstr_act değerini replace uzunluğu kadar artırma
     newstr_act += replace_len;
  }

  // Kalan değerleri newstr belleğine kopyalama
  memcpy(newstr + newstr_act, str, strlen(str));
  newstr_act += strlen(str);
  *(newstr+newstr_act) = '\0';

  return newstr;
}

Yukarıdaki örnekte, program aynı dizinde bulunan "dosya_utf8.txt" adlı dosyayı okuduktan sonra içeriğini doğrudan ekrana yazar. Dosya içeriğindeki Türkçe karakterleri bg_utf8_ISO88599() fonksiyonu ile ekranda normal bir şekilde görüntülenecek karakterlere çevirdikten sonra, içeriği tekrar ekrana yazar.