История изменений
Исправление thunar, (текущая версия) :
работать с массивами хоть в куче, хоть не в куче
Ты упорот? Я тебе только-что доказал что массивов вне стека нет из за того что размер неизвестен, а он опять за старое.
Или путём перебора до условного конца (например, '\0').
А сложность сего действа O(n) а не O(1) — т.е. получаем ту же бодягу что с юникодом.
Но, с юникодом это так с ходу не сработает из за модификаторов.
Ну поясни. Вот, например:
size_t utf8len(const char* str){
size_t len = 0;
for(char* s = (char*)str; *s; s++){
if ((*s & 0xC0) != 0x80) len++;
} return len;
}
void foo(char* s){
size_t nbytes = strlen(s);
size_t nsymb = utf8len(s);
cout<<"\""<<s<<"\": "<<nsymb<<" symbols ("<<nbytes<<" bytes)"<<endl;
}
int main(int argc, char **argv)
{
foo("J");
foo("Ж");
foo("Ç");
foo("⺟");
foo("𠜎");
return 0;
}
"J": 1 symbols (1 bytes)
"Ж": 1 symbols (2 bytes)
"Ç": 1 symbols (2 bytes)
"⺟": 1 symbols (3 bytes)
"𠜎": 1 symbols (4 bytes)
Исходная версия thunar, :
работать с массивами хоть в куче, хоть не в куче
Ты упорот? Я тебе только-что доказал что массивов вне стека нет из за того что размер неизвестен, а он опять за старое.
Или путём перебора до условного конца (например, '\0').
А сложность сего действа O(n) а не O(1) — т.е. получаем ту же бодягу что с юникодом.
Но, с юникодом это так с ходу не сработает из за модификаторов.
Ну поясни. Вот, например:
size_t utf8len(const char* str){
size_t len = 0;
for(char* s = (char*)str; *s; s++){
if ((*s & 0xC0) != 0x80) len++;
} return len;
}
void foo(char* s){
size_t nbytes = strlen(s);
size_t nsymb = utf8len(s);
cout<<"\""<<s<<"\": "<<nsymb<<" symbols ("<<nbytes<<" bytes)"<<endl;
}
int main(int argc, char **argv)
{
foo("J");
foo("Ж");
foo("Ç");
foo("⺟");
foo("𠜎");
return 0;
}
"J": 1 symbols (1 bytes)
"Ж": 1 symbols (2 bytes)
"Ç": 1 symbols (2 bytes)
"⺟": 1 symbols (3 bytes)
"𠜎": 1 symbols (4 bytes)