Существует два возможных подхода.
Преобразование перед выполнением
Использование (запись) внешней программы для преобразования текстов в целевую кодировку.Он должен вывести список #define
строк или определение enum
и массив байтов в синтаксисе C, который можно использовать как заголовок в #include
.Например,
#define SOME_TEXT "\xE2\x96\x94\x85\x40\xA3\x85\xA7\xA3" /* this is actually EBCDIC */
, затем используйте их в программе
const char *sometext = SOME_TEXT;
Это выгодно на встроенной платформе с ограниченной скоростью и памятью, поскольку таблицы преобразования и подпрограммы не хранятся нацель.
Недостатком является то, что текст, предоставленный другими системами в электронном виде (по сети или на карте памяти), все же должен каким-то образом преобразовываться перед использованием.
Преобразование во время выполнения
Конечно, вы можете использовать простую функцию преобразования, которая принимает строку в юникоде и преобразует ее символ за символом в другую кодировку, используя таблицу сопоставления, например
struct ucs_to_marc8 {
unsigned char code1, code2;
unsigned char marc8;
};
const struct ucs_to_marc8 ucs_to_marc8_table[] = {
{ 0xD8, 0xA7, 0xC7 }, // aleph
{ 0xD8, 0xA8, 0xC8 }, // beh
/* etc */
{ 0, 0, 0 } };
.