Команда indexOf() не работает в строке с русскими буквами
- Войдите на сайт для отправки комментариев
Втр, 13/10/2020 - 17:25
Всем привет, друзья! У меня есть программа которая находит восклицательный знак в строке и выводит его индекс:
String MyStr = "&привет! мир"; void setup() { Serial.begin(115200); } void loop() { Serial.print("Индекс восклицательного знака: "); Serial.println(MyStr.indexOf('!')); }
По сути, индекс восклицательного знака должен быть равен 7. Но вместо этого он равен числу 13. Кто знает как это можно исправить? Может дело в кодировке русских букв? Буду очень признателен если вы мне подскажите :-)
Зачитай чонить за UTF-8
индекс восклицательного знака должен быть равен 7. Но вместо этого он равен числу 13. Кто знает как это можно исправить?
не надо это исправлять, это правильный ответ.
Если вы попытаетесь извлечь этот символ методом at() - вы убедитесь. что он таки там на позиции 13, а не 7
Спасибо! Сейчас проверю.
Этот код работает с байтами, а не символами. Поскольку символ может занимать несколько байт, такие манипуляции не будут работать с кириллицей.
Спасибо за совет! Только как сделать так, чтобы этот скетч мог работать с кириллицей? PS: я слабо разбираюсь в кодировках и методах String
я слабо разбираюсь в кодировках и методах String
тогда я не знаю, как вам помочь.
Можно либо научиться работать с UTF, либо перевести русские надписи в однобайтовую кодировку. В любом случае надо понимать про кодировки.
Этот код работает с байтами, а не символами. Поскольку символ может занимать несколько байт, такие манипуляции не будут работать с кириллицей.
А мне вот интересно какая птица его минусанула за правильный совет... От жеж клоуны :)
Я вот нашёл ещё один теоретически рабочий способ. Недавно, мне надо было вывести русские буквы на OLED I2C дисплей с шиной SSD1306. Для этого я использовал функцию перекодировки из UTF-8 в Windows-1251. PS: её я нашёл на этом-же форуме:
Я попробовал применить эту функцию и о чудо! Всё заработало))) Спасибо человеку под ником arduinec. Вот код который у меня получился:
Спасибо всем кто мне что-либо советовал
Этот код работает с байтами, а не символами. Поскольку символ может занимать несколько байт, такие манипуляции не будут работать с кириллицей.
А мне вот интересно какая птица его минусанула за правильный совет... От жеж клоуны :)
А какой правильный ответ он дал? "такие манипуляции не будут работать с кириллицей"? Так ТС ниже провел таки успешные манипуляции. Ни одного толкового совета озвучено не было.
только фукцию перекодировки надо объявлять до её первого применения
А какой правильный ответ он дал? "такие манипуляции не будут работать с кириллицей"? Так ТС ниже провел таки успешные манипуляции. Ни одного толкового совета озвучено не было.
Русским по белом написано, что каждый русский символ представлен двумя байтами, то есть номер символа в строке не такой как ты видишь на экране. Че не так то ?
А мне вот интересно какая птица его минусанула за правильный совет... От жеж клоуны :)
"Че не так то ?"
Так совета то и не было.
У меня у самого мало опыта в Ардуино. И с такой проблемой я раньше не сталкивался, т.к. ковырялся в протеусе и Atmel Studio, и там у работал в 1251. Поэтому эта тема меня заинтересовала. Но дельного совета, что делать - я не увидел. Да это UTF-8. Но что делать? Переходить с UTF8 на 1251 по умолчанию - тогда как? Использовать UTF - но это как минимум в два раза больше памяти и как оказывается (может ошибаюсь) теряется часть функционала String и других библиотек.
Может быть на этот вопрос уже так часто отвечали, что уже и не хочется, но я по быстрому ответов не нашел.
Да это UTF-8. Но что делать? Переходить с UTF8 на 1251 по умолчанию - тогда как? Использовать UTF - но это как минимум в два раза больше памяти
есть третий метод, самый простой - не использовать кириллицу вообще. На латинице все символы по одному байту и методы библиотек работают :)
Так совета то и не было.
Единственно правильный совет был дан сразу - разобраться с кодировками кириллицы.
У меня у самого мало опыта в Ардуино. И с такой проблемой я раньше не сталкивался,
Но дельного совета, что делать - я не увидел. Да это UTF-8. Но что делать?
Может быть на этот вопрос уже так часто отвечали, что уже и не хочется, но я по быстрому ответов не нашел.
Единственно правильный совет был дан сразу - разобраться с кодировками кириллицы.
После такого утверждения в самом начале поста, относиться всерьез к оставшемуся тексту было бы опрометчиво.
Единственно правильный совет = "Зачитай чонить за UTF-8"
После такого утверждения в самом начале поста, относиться всерьез к оставшемуся тексту было бы опрометчиво.
а какого совета вы ждете? Вы думаете, есть способ, ничего не изучая, разом решить вопрос? Заклинание? "Елики-беники, съели вареники, решись мая проблемка сама сейчас же!" ??
Вот вам еще варианты, как решить проблему, не вникая в суть:
- отказаться от кириллицы
- заказать разработку программы знающему программисту
Кстати, ТС , в отличии от вас - свою проблему решил. Потому что не вставал в позу, что ему все должны - а искал и думал сам.
а какого совета вы ждете? Вы думаете, есть способ, ничего не изучая, разом решить вопрос? Заклинание? "Елики-беники, съели вареники, решись мая проблемка сама сейчас же!" ??
Вот вам еще варианты, как решить проблему, не вникая в суть:
- отказаться от кириллицы
- заказать разработку программы знающему программисту
Кстати, ТС , в отличии от вас - свою проблему решил. Потому что не вставал в позу, что ему все должны - а искал и думал сам.
Да нет у меня проблемы в этом вопросе. С чего вы это взяли? Я выше это все уже писал. Я пользуюсь win-1251 по умолчанию, и мне этого хватает. Мне просто стало интересно, как с этим обстоит в arduino IDE. И первый мой пост в этой теме был о том, почему поставил минус. Никакой помощи не просил.
Upper, можно вопрос? А в атмел студии можно применять функции до их объявления?
Upper, можно вопрос? А в атмел студии можно применять функции до их объявления?
Атмел студия сама добавляет предварительные объявления функций при импорте скетча ардуино.
Так что в скетче предварительного может не быть, но в Атмел студии быть должно.
Единственная проблема функции utf8rus() это то, что при выводе переменной MyStr в COM порт мы получаем это:
Господа, а подскажите почему до сих пор у новичков такие проблемы с UTF-8? Не судьба применить другую кодировку из оперы 437, по типу KOI8 там, не? Всё ж придумано до нас ещё на БКшках и спектрумах, когда мы молодого Гейтса с Windows 95 в москвах принимали. Тогда вроде ещё дунди по прилавкам в дефиците лежала, и шваль всякая бритоголовая по улицам на побитых меринах каталась, стреляя из нечищенного ТТ.
Каждый второй блин про мультибайтные кодировки спрашивает, хотя его задача проста до идиотизма - русские буквы на экране видеть. Ну заюзай ты любую из кодировок DOS, не изобретай велосипед. В такое умеет любой вменяемый редактор (ну если вы конечно не в блокноте Windows кодите).
я подумал, что IDE умеет, ан нет )))
// �� ������ ������� ������ DetSimen �������� 2020
//
#pragma once
#include <Arduino.h>
#include <SoftwareSerial.h>
const bool ON = true;
const bool OFF = false;
#pragma pack(push,1)
struct FT897DCommand { // ����� ������
Господа, а подскажите почему до сих пор у новичков такие проблемы с UTF-8? Не судьба применить другую кодировку из оперы 437, по типу KOI8 там, не? ...
Я не со стороны "Господ". Дам со своей стороны очевидный (для меня) ответ. У новичка до сих пор проблемы, потому что он каждый раз новый человек.
Можно потроллить тему дальше и написать, что частое поведение господ - троллинг новичков.
Конкретно в данном случае, логичнее бы звучал вопрос от вас - "Господа, а подскажите почему до сих пор советуете новичкам использовать UTF-8?".
Господа, а подскажите почему до сих пор у новичков такие проблемы с UTF-8? Не судьба применить другую кодировку из оперы 437, по типу KOI8 там, не? Всё ж придумано до нас ещё на БКшках и спектрумах, когда мы молодого Гейтса с Windows 95 в москвах принимали. Тогда вроде ещё дунди по прилавкам в дефиците лежала, и шваль всякая бритоголовая по улицам на побитых меринах каталась, стреляя из нечищенного ТТ.
Каждый второй блин про мультибайтные кодировки спрашивает, хотя его задача проста до идиотизма - русские буквы на экране видеть. Ну заюзай ты любую из кодировок DOS, не изобретай велосипед. В такое умеет любой вменяемый редактор (ну если вы конечно не в блокноте Windows кодите).
1. В байт все существующие в Мире символы не поместить, а потому однобайтовые кодировки - вчерашний день. Не говоря о том, что и с однобайтовыми тоже были сплошные проблемы: разных кодировок кириллицы насчитывалось не менее 6 штук.
2. Компиляторы традиционно требуют однобайтовую кодировку. Собственно, кроме латиницы операторы ЯП ничем другим не пользуются, поэтому одного байта (даже 7 бит) достаточно.
Вот из этих двух соображений и используется UTF-8. С одной стороны, она позволяет кодировать все существующие символы, а с другой - совместима с существующими компиляторами.
По сути альтернативы нет. Ну а новичкам необходимо учиться. По крайней мере, если они не планируют вечно пребывать в статусе новичков.
PS. В 437 кодировке кириллицы нет.