C 語言字元編碼完整指南:從基礎到多語系支援的實作技巧

1. 前言

在 C 語言中,「字元編碼」是將文字以數值表示並在程式中處理的重要基礎。正確理解字元編碼,特別是在需要支援日文等多語系環境時,是不可或缺的,亦能防止文字亂碼與資料處理錯誤。本文將從 C 語言的字元編碼基礎開始,詳細解說不同字元編碼的使用方式,以及在字串操作中的注意事項。透過本文章,您將能扎實掌握 C 語言的文字處理與字元編碼基礎,並培養實用技能。

2. 什麼是 C 語言的字元編碼?基礎與種類

字元編碼的基礎

字元編碼是一種將文字以數值表示,讓電腦能解讀文字的規格。例如,在 ASCII 編碼中,英文字母「A」對應的數值是 65。在包括 C 語言在內的許多程式語言中,文字都是透過這類字元編碼進行處理與顯示的。

常見的字元編碼種類

ASCII

ASCII(American Standard Code for Information Interchange,美國資訊交換標準碼)是一種包含英數字與符號的 7 位元字元集,是 C 語言的基本字元編碼。ASCII 編碼對應 0 到 127 的數值,專為英文環境的文字表示而設計。

Unicode 與 UTF-8

Unicode 是為多語系支援而開發的字元編碼標準。UTF-8 是 Unicode 的其中一種編碼方式,採用可變長度編碼,並與 ASCII 相容。UTF-8 在需要多語系支援的系統與網路環境中被廣泛使用。

Shift_JIS 與 EUC-JP

在日文環境中,常用的字元編碼包括 Shift_JIS 與 EUC-JP。Shift_JIS 多用於 Windows 環境,可用 2 位元組表示日文漢字與片假名等。EUC-JP 主要用於 UNIX 系統,其結構與 Shift_JIS 不同,但同樣支援日文字元。

年収訴求

3. C 語言中文字與字元編碼的基本操作

char 型別的基礎

在 C 語言中,文字以 char 型別表示。char 佔用 1 位元組記憶體,儲存對應的字元編碼數值。以下是 char 型別的基本操作範例:

char letter = 'A';   // 直接指定字元
char code = 65;      // 以數值指定 ASCII 編碼

使用跳脫序列(Escape Sequence)

為表示特定操作,可使用稱為跳脫序列的特殊符號。例如,換行與定位符是常見的控制字元。

char newline = '\n';  // 換行字元
char tab = '\t';      // Tab 字元

透過跳脫序列,程式可有效處理控制字元。

4. 在 C 語言中取得與顯示字元編碼

本節將說明如何在 C 語言中取得字元編碼並顯示。

使用 printf 顯示字元編碼

在 C 語言中,可用 printf 輕鬆輸出字元與其編碼:

#include <stdio.h>

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

此範例會輸出字元 'A' 及其 ASCII 編碼 65。

範圍輸出字元編碼

也可一次輸出指定範圍內的字元與編碼,例如 ASCII 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. C 語言中字元編碼與字串操作

進行字串操作時,理解字元編碼並正確使用函式非常重要。

安全的字串複製與 strncpy 使用

strncpy 可在指定目標陣列大小的情況下安全複製字串,避免緩衝區溢位。相較之下,strcpy 若目標陣列不足,可能導致記憶體錯誤,因此建議使用 strncpy

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello";
    char dest[10];
    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0';
    printf("Copied string: %s\n", dest);
    return 0;
}

字串比較與 strcmp 使用

比較字串時,可使用 strcmp 判斷是否相同:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Apple";
    char str2[] = "Banana";
    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("The strings are equal.\n");
    } else {
        printf("The strings are not equal.\n");
    }
    return 0;
}

6. 處理日文文字的注意事項

要正確處理日文等多位元組文字,必須指定正確的字元編碼。若出現亂碼,可能是編碼不一致造成的。

範例:使用 setlocale 輸出日文

以下程式示範如何用 UTF-8 輸出日文:

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

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

7. C 語言中的字元編碼轉換與相容性

不同字元編碼之間的轉換通常使用 iconv 函式庫。以下是 Shift_JIS 轉 UTF-8 的範例:

#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>

int main() {
    iconv_t cd = iconv_open("UTF-8", "SHIFT_JIS");
    char sjis_str[] = "こんにちは";
    char utf8_str[100];
    char *inbuf = sjis_str;
    char *outbuf = utf8_str;
    size_t inbytesleft = strlen(sjis_str);
    size_t outbytesleft = sizeof(utf8_str) - 1;

    iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
    printf("UTF-8: %s\n", utf8_str);
    iconv_close(cd);
    return 0;
}

8. 總結

理解 C 語言中字元編碼的處理方式,對於開發包含日文的多語系應用程式非常重要。透過使用 strncpy 等安全函式與 iconv 進行編碼轉換,可有效避免亂碼與資料處理錯誤。

侍エンジニア塾