C-keeles märgikoodid: ASCII, Unicode ja UTF-8 põhjalik juhend

1. Sissejuhatus

C-keeles on “märgikood” alusmehhanism, mis esitab tähemärgid numbritena ja võimaldab neid programmis töödelda. Märgikoodide õige mõistmine on hädavajalik, eriti juhul, kui on vaja toetada mitut keelt, näiteks jaapani keelt, et vältida tähemärkide moonutamist või andmetöötlusvigu. Käesolevas artiklis selgitame üksikasjalikult C-keele märgikoodide põhitõdesid, erinevate märgikoodide käsitlemist ja tähelepanupunkte stringide töötlemisel. Selle artikli kaudu omandad tugeva aluse C-keele tähemärkide töötlemisel ja praktilised oskused.

2. Mis on C-keeles märgikood? Põhitõed ja tüübid

Märgikoodi põhitõed

Märgikood on standard, mis esitab tähemärgid numbritena, et arvuti saaks neid tõlgendada. Näiteks ASCII-koodis vastab täht “A” numbrile 65. Paljud programmeerimiskeeled, sealhulgas C, kasutavad tähemärkide kuvamiseks ja töötlemiseks märgikoode.

Levinumad märgikoodide tüübid

ASCII

ASCII (American Standard Code for Information Interchange) on 7-bitine tähemärgikogum, mis sisaldab ladina tähti, numbreid ja sümboleid ning on C-keele põhiline märgikood. ASCII-kood katab väärtused 0 kuni 127 ja on mõeldud ingliskeelseks tekstiks.

Unicode ja UTF-8

Unicode on loodud mitmekeelse toe jaoks. UTF-8 on üks Unicode’i kodeerimisviise, mis kasutab muutuva pikkusega kodeeringut ja ühildub ASCII-ga. UTF-8 on laialt kasutusel süsteemides ja veebikeskkondades, kus on vaja mitmekeelset tuge.

Shift_JIS ja EUC-JP

Jaapani keeles kasutatavad märgikoodid hõlmavad Shift_JIS ja EUC-JP. Shift_JIS on eriti levinud Windowsi keskkonnas ja esitab jaapani kanji- ja katakana-märgid kahe baidiga. EUC-JP on levinud UNIX-põhistes süsteemides ja kasutab erinevat struktuuri jaapani keele toetamiseks.

侍エンジニア塾

3. Tähemärkide ja märgikoodide põhikäsitlus C-keeles

char-tüübi põhitõed

C-keeles esitatakse tähemärgid char-tüübina. char kasutab 1 baiti mälust ja salvestab sinna vastava märgikoodi numbrilise väärtuse. Näiteks:

char letter = 'A';   // Tähemärgi otsene määramine
char code = 65;      // ASCII koodi määramine numbrina

Põgenemissekventside kasutamine

Erimärkide esitamiseks kasutatakse põgenemissekventse. Näiteks uus rida või tabeldus:

char newline = '\n';  // Reavahetus
char tab = '\t';      // Tabeldus

Põgenemissekventside abil saab programmis juhtmärke tõhusalt hallata.

4. Märgikoodide hankimine ja kuvamine C-keeles

Märgikoodi kuvamine printf-funktsiooniga

C-keeles saab printf-funktsiooni abil hõlpsalt kuvada tähemärki ja selle koodi:

#include <stdio.h>

int main() {
    char ch = 'A';
    printf("Character: %c, ASCII Code: %d\n", ch, ch);
    return 0;
}

Ülaltoodud kood kuvab tähe 'A' ja selle ASCII-koodi 65.

Märgikoodide vahemiku kuvamine

Võimalik on kuvada kõik tähemärgid ja nende koodid kindlas vahemikus, näiteks ASCII-koodid vahemikus 32–126:

#include <stdio.h>

int main() {
    for (int code = 32; code <= 126; code++) {
        printf("ASCII code %d: %c\n", code, (char)code);
    }
    return 0;
}

5. Märgikoodid ja stringide töötlemine C-keeles

Turvaline stringi kopeerimine strncpy-ga

strncpy-funktsioon võimaldab turvaliselt kopeerida stringe, määrates sihtmassiivi suuruse ja vältides puhvri ületäitmist. strcpy võib väikse puhvri korral põhjustada mälutõrkeid, mistõttu on strncpy eelistatud.

Stringide võrdlemine strcmp-ga

Stringide võrdlemiseks kasutatakse strcmp-funktsiooni, mis tagastab 0, kui stringid on identsed.

6. Jaapani tähemärkide käsitlemine ja ettevaatusabinõud

Mitmebaidiste märkide (nt jaapani keel) korrektseks käsitlemiseks C-keeles tuleb määrata õige märgikood. Kui tekst moonutatakse, võib põhjus olla vale kodeering.

Näide: Jaapani keele kuvamine setlocale-ga

Alltoodud kood näitab, kuidas kuvada jaapani keelt UTF-8-s:

#include <stdio.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, "ja_JP.UTF-8");
    printf("こんにちは\n");
    return 0;
}

7. Märgikoodide teisendamine ja ühilduvus C-keeles

Erinevate kodeeringute vaheliseks teisendamiseks kasutatakse tavaliselt iconv-teeki. Näiteks Shift_JIS → UTF-8 teisendus:

8. Kokkuvõte

Märgikoodide mõistmine C-keeles on oluline mitmekeelsete rakenduste loomisel. Turvaliste funktsioonide (nt strncpy) ja teisendustööriistade (nt iconv) kasutamine aitab vältida tähemärkide moonutamist ja andmetöötlusvigu.