0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
size_t buflen;
size_t i;
char *obuffer;
if (argc != 2) {
fprintf(stderr, "Usage: %s 'some ASCII string'\n", argv[0]);
fprintf(stderr, "\tconvert the string into overlong UTF-8.\n");
return 1;
}
buflen = strlen(argv[1])*2+1;
obuffer = malloc(buflen);
if (obuffer == NULL) {
fprintf(stderr, "Error: cannot allocate %zd bytes of memory.", buflen);
return 2;
}
for (i=0; argv[1][i]; i++) {
obuffer[2*i] = 0xC0|(argv[1][i]>>6);
obuffer[2*i+1] = 0x80|(argv[1][i]&0x3F);
}
obuffer[2*i] = '\0';
puts(obuffer);
free(obuffer);
return 0;
}
В UTF-8 запрещено использовать кодовые последовательности не минимальной длины, например юникоды с номером до 127 требуется кодировать именно в один байт, а не в 2,3 и так далее. А если так всё-таки сделать, полученная фигня называется оверлонгом (overlong). Вот этот код их как раз и создаёт. Но только из ASCII символов и расширяя их только до двух байт. Написание более универсального варианта, если вдруг кому-то надо оставляем как упражнение для читателя.
Что интересно, некоторые текстовые редакторы, если в них открыть файл, сделанный этой программой, увидят обычный текст.
Запостил: Threadwalker,
03 Февраля 2025
guest6 4 дня назад # 0
guest6 4 дня назад # 0
guest6 4 дня назад # 0
Threadwalker 4 дня назад # 0