Диакритические знаки в массивах или строках C char
Фон
Я работаю над некоторым встроенным проектом, и я пытаюсь обрабатывать нестандартные символы и шрифт.
У меня есть сырой растровый шрифт в массиве 600+ элементов. Каждые 5 элементов этого массива содержат один символ. У меня есть символ 32 (пробел) в первых 5 элементах, 33 символа (!) В 6-10 элементах и т. Д.
Я должен работать с национальными диакритическими знаками (например, "ę"). Я нашел их после 122 символов. Теперь я пытаюсь переназначить символы, чтобы печатать правильный символ, когда я печатаю print("Test ę");
в C источник.
проблема
Поэтому я хочу напечатать как это в источнике:
print("Test diactric ę");
// warning: (228) illegal character (0xC4)
Когда я пытаюсь это сделать (я пытался увидеть, какой код C поместит для "ę"):
int a = 'ę';
// error: (226) char const too long
Как обойти это?
Я использую компилятор XC8 (на основе gcc?).
В руководстве по компилятору я обнаружил, что в нем используется 7-битная кодировка символов, но, может быть, есть какой-то способ? Мой исходный файл закодирован в UTF-8.
РЕДАКТИРОВАТЬ
Похоже, что wchar.h, предложенный Эмилианом, мог бы работать для меня, но, к сожалению, для моего компилятора wchar.h не существует.
Может быть, какой-то трюк препроцессора? Я действительно хочу избежать такой жесткой подготовки текста:
print("abcde");
print_diactric(123); // 123 code used for ę
print("fgh");
// to get "abcdeęf" "word"
2 ответа
Вам нужно подумать о разнице между исходной кодировкой (как она звучит, кодировкой символов, используемой вашими исходными файлами C в системе, в которой работает компилятор) и целевой кодировкой, которая является кодировкой, которую компилятор предполагает для системы. где код будет работать.
Если целевая кодировка вашего компилятора "7-битная", тогда не существует стандартного способа выражения символа, такого как ę, он просто не является частью целевой кодировки. Вам придется обойти это, возможно, самостоятельно внедрив кодировку из какого-то другого формата.
Как поясняется, для кодирования этих символов понадобится не более 7 бит, может быть, вы можете использовать тип широких символов?
#include <wchar.h>
#include <stdio.h>
int main(){
printf("%s\n", "漢語");
printf("%s\n", "ę");
}
выход:
~$ gcc wcharexample.c -o wcharexample && ./wcharexample
漢語
ę