UTF-strings

Run Settings
LanguageC
Language Version
Run Command
#include <stdio.h> #include <stdlib.h> /* Функция сравнивает стрки */ int str_comp(const char *a, const char *b){ while (*a && *b && *a == *b) ++a, ++b; return *a - *b; } /* Функция определяет длину строки в байтах */ int str_len(const char *str) { int res; for (res = 0; *str != '\0'; str++, res++); return res; } /* Функция определяет длину символа UTF-8 */ int u8_char_len(char first_byte) { unsigned short int bytes = 0; if ((first_byte & 0xC0) == 0xC0) { if ((first_byte & 0xF0) == 0xF0) bytes = 4; else if ((first_byte & 0xE0) == 0xE0) bytes = 3; else bytes = 2; } else bytes = 1; return bytes; } /* Функция определяет длину строки UTF-8 */ int u8_str_len(const char *str) { int count; for (count = 0; *str != '\0'; str += u8_char_len(*str), count++); return count; } /* Функция возвращает символ строки UTF-8 по номеру */ char* u8_str_index(char *str, int index) { static char res[5]; int i, j, count, start_index, stop_index; for (i = 0, count = 0; count <= index; i += u8_char_len(str[i]), count++) { if (count == index) { start_index = i; stop_index = i + u8_char_len(str[i]); break; } else if (str[i] == '\0') { printf("%s %d %s", "!!! Выход за пределы диапазона: элемент с индексом", index, "отсутствует\n"); exit(EXIT_FAILURE); } } for (j = start_index; j < stop_index; j++) { res[j - start_index] = str[j]; } res[stop_index - start_index] = '\0'; return res; } int main(void) { char str[] = "Иероглифы-漢字!"; printf("%d\n\n", str_len(str)); printf("%s\n", u8_str_index(str, 1)); printf("%d\n", u8_str_len(str)); printf("%d\n", u8_str_len(str)); printf("%s\n", u8_str_index(str, 1)); printf("%s\n", u8_str_index(str, 2)); printf("%d\n", u8_str_len(str)); printf("%s\n", u8_str_index(str, 4)); printf("%s\n", u8_str_index(str, 5)); printf("%s\n", u8_str_index(str, 6)); printf("%s\n", u8_str_index(str, 11)); printf("%s\n", u8_str_index(str, 19)); printf("%s\n", u8_str_index(str, 18)); return 0; }
Editor Settings
Theme
Key bindings
Full width
Lines