Мне нужно сделать код, который принимает символы с кодировкой UTF-8 и «переводит» их в Unicode. Здесь вы можете проверить, что такое UTF-8: https://en.wikipedia.org/wiki/UTF-8. Я начинающий C поэтому у меня есть три ограничения, наложенные на меня:Кодирование UTF-8 в C с getchar()
- я должен использовать
getchar()
- запрещено использовать массивы
- Я заинтересован только в символах Unicode с 1,2,3 и 4 байта
Поэтому у меня есть этот код, который является полностью функциональным для 4 байта (я знаю, что я должен использовать != EOF
для каждого getchar();
, но сейчас это не моя проблема)
#include <stdio.h>
int main(void) {
int ch1, ch2, ch3, ch4, c;
ch1 = getchar();
ch2 = getchar();
ch3 = getchar();
ch4 = getchar();
if ((ch1 & 0xF8) != 0xF0 || (ch2 & 0xC0) != 0x80 ||
(ch3 & 0xC0) != 0x80 || (ch4 & 0xC0) != 0x80) {
printf("Error in UTF-8 4-byte encoding\n");
return 1;
}
c = ((ch1 & 0x07) << 18) | ((ch2 & 0x3F) << 12) |
((ch3 & 0x3F) << 6) | (ch4 & 0x3F);
printf("c = %05X\n", c);
return 0;
}
Мой вопрос: я не могу понять, как я могу использовать getchar()
для 1-2-3 байта. Я имею в виду, что я должен прочитать все функции getchar
в начале, а затем использовать ch1
для 1-байтовых символов и ch1
, ch2
для двухбайтовых символов. Или я должен сделать это следующим образом. (Кстати, код ниже, это не работает, это дает мне бесконечный цикл,. Я просто использовать его в качестве примера моей мысли)
#include <stdio.h>
int main (void) {
int ch1, ch2, ch3, ch4, c;
if (c >=0x0000 && c<=0x007F){
ch1=getchar();
while (ch1 !=EOF){
if ((ch1 & 0x80) != 0x00) {
printf("Error in UTF-8 1-byte encoding\n");
return 1;
}
c = ((ch1 & 0x80) << 7);
printf("c = %05X\n", c);
}
}
Обратите внимание, что UTF-8 не нуждается в более чем 4 байтах, поскольку Unicode ограничивается диапазоном U + 0000 .. U + 10FFFF. Действительно, некоторые байты - 0xC0, 0xC1 и 0xF5 .. 0xFF не могут отображаться в действительном UTF-8. См. Также [Действительно хорошие, плохие примеры тестовых данных UTF-8] (https://stackoverflow.com/questions/1319022/really-good-bad-utf-8-example-test-data) –