Нераспознается русский текст

Xomyc
Offline
Зарегистрирован: 10.04.2020

Столкнулся с какой-то странностью. Если текст на латинице ввожу, то он читается правильно. Количество символов имею ввиду, а русский, каждая буква за 2 считается.

Вот самый простой скрипт:

String K = "Баба";
Serial.print(K);Serial.println(K.length());

Длину выдает 8 символов!

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А почему вы не в песочнице ?

 

b707
Offline
Зарегистрирован: 26.05.2017

Xomyc пишет:

Длину выдает 8 символов!

так и должно быть. это ж "БАБА"

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Рекомендую что нибудь почитать про кодировке.
В частности про UTF-8

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Kakmyc пишет:
Рекомендую что нибудь почитать про кодировке. В частности про UTF-8

Не могу, глаза режет... Я сам не грамотный , но.... ПРО кодировкИ , но О кодировкЕ :)

Именительный, родительный , дательный , винительный, предложный  ;)  А еще творительный !

Kakmyc
Offline
Зарегистрирован: 15.01.2018

brokly пишет:

Kakmyc пишет:
Рекомендую что нибудь почитать про кодировке. В частности про UTF-8

Не могу, глаза режет... Я сам не грамотный , но.... ПРО кодировкИ , но О кодировкЕ :)

Именительный, родительный , дательный , винительный, предложный  ;)  А еще творительный !


Автоисправление, порой и не такое откаблучивает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Xomyc пишет:

Столкнулся с какой-то странностью. Если текст на латинице ввожу, то он читается правильно. Количество символов имею ввиду, а русский, каждая буква за 2 считается.

Вот самый простой скрипт:

String K = "Баба";
Serial.print(K);Serial.println(K.length());

Длину выдает 8 символов!

Не 8 символов, а 8 байтов. И это правильно.

В Си/Си++ нет типа данных напрямую соответствующих символу в кодировке переменной длины. А в utf-8 один символ может занимать от 1 до 6 байтов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Xomyc пишет:
Длину выдает 8 символов!

Это же русский язык. Что русскому хорошо, англичанину смерть.

помИнительный, безРодительный, преДательный, обВинительный,преТворительный и Предложный.

ПС: Xomyc, вот ответьте :почему в автомобиле есть задняя скорость, а заднего руля нет?? Как без него задом ехать.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ну отцы старожилы спасибо! Мордой в грязь макнули, место указали. Так сказать все формальности соблюдены, захожие глупые начинающие посрамлены. Собственно такое чуть не в каждой теме наблюдается. А конфетку? Про UTF-8 и 2 байта на символ сам уже нашел и много чего. Вот только из решения только самописные процедуры. Неужели ничего стандартного нет? У Adafruit-GFX нашел процедурку, которая правильно считает дину строки. Но пока не пойму как с этим поиграть.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Xomyc пишет:

Ну отцы старожилы спасибо! Мордой в грязь макнули, место указали.

А что, собственно, Вы ожидали услышать после того, как корректное поведение многократно проверенных функций объявили неправильным?

Как говорится, каков вопрос, таков и ответ.

negavoid2
Offline
Зарегистрирован: 06.05.2020

Вопроса-то не было. Вот конфетка:

size_t utf8len(char *s)
{
    size_t len = 0;
    for (; *s; ++s) if ((*s & 0xC0) != 0x80) ++len;
    return len;
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Но эта конфетка только для русского, а есть еще много других языков.

negavoid2
Offline
Зарегистрирован: 06.05.2020

Для всех языков.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

negavoid2 пишет:

Для всех языков.

Готовы продемонстрировать, как это работает для китайского?

negavoid2
Offline
Зарегистрирован: 06.05.2020
#include <stddef.h>
#include <iostream>

size_t utf8len(char *s)
{
    size_t len = 0;
    for (; *s; ++s) if ((*s & 0xC0) != 0x80) ++len;
    return len;
}

int main()
{
	char * test = "你好 谢谢";
	std::cout << utf8len(test);
}

#g++ test.c

#a.exe

5

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, китайского я не знаю, но с ходу подобрать контрпример мне не удалось.

negavoid2
Offline
Зарегистрирован: 06.05.2020

Хоть смайлики c обезъянками считайте, хоть тайский, хоть какой, хоть смиксуйте все языки в строке, стартовые биты продолжения будут те же.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Звиняйте, что я тут подаю голос. Пишет error: 'count' is not a member of 'std' (ну или cout как у вас написано). (и тут же спрятался обратно под тапок)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А сможете объяснить, оно вам зачем ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Отсутствие setup(), loop() в исходнике вообще не смущает?

Xomyc
Offline
Зарегистрирован: 10.04.2020

brokly пишет:

А сможете объяснить, оно вам зачем ?

Если вопрос ко мне, то я делаю эдакие часы, метеостанцию из 4 светодиодных матриц 16х16 на стену.Можно конечно плюнуть и выводить по аглицки. Но тогда все просто будет. А хочется помучацца.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Xomyc пишет:

Звиняйте, что я тут подаю голос. Пишет error: 'count' is not a member of 'std' (ну или cout как у вас написано). (и тут же спрятался обратно под тапок)

Правильно пишет.
В оригинале "cout"

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Xomyc пишет:

brokly пишет:

А сможете объяснить, оно вам зачем ?

Если вопрос ко мне, то я делаю эдакие часы, метеостанцию из 4 светодиодных матриц 16х16 на стену.Можно конечно плюнуть и выводить по аглицки. Но тогда все просто будет. А хочется помучацца.


А у меня вопрос - насколько сильно вы мучаетесь? А по времени - сколько минут мучались? Кто заставляет вас мучаться? Какие мысли возникают в процессе мучений? Каждый, кто мучался с Вами, получит по экземпляру часов?

Вопросы задаю в рамках иследования на тему "Социальные группы форума Arduino.ru и проблемы их взаимоотношений".

negavoid2
Offline
Зарегистрирован: 06.05.2020

Аха, вот я вас и раскрыл по нику :) sad-man не только грустный, но и маркиз Альфонс Франсуа :)))))

Xomyc
Offline
Зарегистрирован: 10.04.2020

Kakmyc пишет:
Xomyc пишет:

Звиняйте, что я тут подаю голос. Пишет error: 'count' is not a member of 'std' (ну или cout как у вас написано). (и тут же спрятался обратно под тапок)

Правильно пишет. В оригинале "cout"

Ну это не принципиально. Пишет:

error: 'cout' is not a member of 'std' Ну т.е. не работает.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

negavoid2 пишет:

Хоть смайлики c обезъянками считайте, хоть тайский, хоть какой, хоть смиксуйте все языки в строке, стартовые биты продолжения будут те же.

Респект.

Я вот уже много лет работаю с utf-8 (причем, на мой взгляд, вполне успешно), но досконально разобраться, какие битики что означают, так и не удосужился.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Xomyc пишет:

Kakmyc пишет:
Xomyc пишет:

Звиняйте, что я тут подаю голос. Пишет error: 'count' is not a member of 'std' (ну или cout как у вас написано). (и тут же спрятался обратно под тапок)

Правильно пишет. В оригинале "cout"

Ну это не принципиально. Пишет:

error: 'cout' is not a member of 'std' Ну т.е. не работает.

 

А кто пишет то?

Вот вариант без cout:

#include<stdio.h>
/
size_t utf8len(char *s)
{
    size_t len = 0;
    for (; *s; ++s) if ((*s & 0xC0) != 0x80) ++len;
    return len;
}

int main()
{
	char * test = "我收到了第二份指南,但它也有問題。我現在病了,沒有能力拍攝視頻或提出爭議。";
	printf("%d %d\n", strlen(test), utf8len(test));
	fflush(stdout);
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Тут видимо идет речь о выравнивании текста на дисплее. Все вменяемые библиотеки обязаны рассказать какого размера в пикселях или попугаях будет фраза выеденная на экран. Так что ТС идет не тем путем.