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.