кирилица в char

AVS
Offline
Зарегистрирован: 11.12.2017

Доброго времени суток. Подскажите. Есть, к примеру, такая строка"

char c[] = "abcd"; если пустить в сериал каждый из этих символов, получаем 

97
98
99
100
0
95
95
95
95
95
0
0
0
0
0
15
1
-117
2
-111

если заменить английские буквы на русские, то 

-48
-80
-48
-79
-48
-78
-48
-77
0
95
95
95
95
95
0
0
0
0
0
15

если и предположить, что -80,-79,-78 и -77 это коды букв, то откуда берется число 48? в английском варианте такого нет.

char c[] = "абвг";

int i = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  while (i < 20 ) {
    Serial.println(c[i], DEC);
    i = i + 1;
  }
  Serial.println("_____");
  i = 0;
}

char совсем кирилицу не поддерживает?

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

Чтайте про кодировку utf-8 (это кодировка с переменным количеством байтов на символ)

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

AVS пишет:

char совсем кирилицу не поддерживает?

Как мне кажется ... я здесь в теме исчерпывающе расписал что и как происходит.

Но администрация форума считает, что может на свой вкус произвольно вытирать любые сообщения в любых количествах.

Благодарите администрацию!

*********************************************************

Администрация, в свою очередь, благодарит Olej за фразу "Для пользователей Linux/UNIX это естественно и понятно ... ну а вЫньдаунов от такого плющит и колбасит.", послужившую причиной удаления поста.

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Olej пишет:

Но администрация форума считает, что может на свой вкус произвольно вытирать любые сообщения в любых количествах.

Вы пять дней на форуме, а начали хамить, холивары разводить, на три буквы людей посылать. Вот Вас самих туда и отправили...

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

kalapanga пишет:

холивары разводить,

Про холивары - это вы ТС-ру расскажите. ;-) Оно ему сильно поможет.

 

AVS
Offline
Зарегистрирован: 11.12.2017

К сожалению я не могу разобраться с этими кодировками, их вроде как очень много различного рода, той же utf8 в интернете тьма и каждая (как понял) для своего языка. Но она что, выбирается или устанавливается автоматически. Ну и желательно, чтобы 1 симпол занимал один байт

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

AVS пишет:
К сожалению я не могу разобраться с этими кодировками,

А вы у kalapanga поспрашивайте - он думает, что это понимает...

AVS пишет:
той же utf8 в интернете тьма и каждая (как понял) для своего языка. Но она что, выбирается или устанавливается автоматически.

Ничего подобного - UTF8 это способ кодирвания для UNICODE представления символов любого языка, ничего выбирать и устанавливать не надо. Всё абсолютно строго стандартизовано ...  

AVS пишет:
Ну и желательно, чтобы 1 симпол занимал один байт

Мало ли что там вам желательно...

 

 

AVS
Offline
Зарегистрирован: 11.12.2017

Но ведь char занимает 1 байт, разве нет? Если вы мне предлагаете что-то весов в2 байта, то боюсь не подойдёт... А можете подсказать, как узнать вес того или иного массива? Автоматически
Боюсь представить, что здесь будет, когда я доготовлю кушать

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

AVS пишет:
Но ведь char занимает 1 байт, разве нет?

char занимает 1 байт. Но char и символ - это не одно и то же.

Любой (в том числе и ASCII) символ в UNICODE выражается 4-байтным значением, которое в способе кодирования UTF-8 представляется переменным числом (1-4) последовательных байт.

И тогда о кодировках, таблицах кодировки, всех этих CP-866, CP-1251, KOI-8r etc. - нужно забыть как страшный сон... всё это уходит в прошлое ... начиная года с 2005-го.

P.S. Всё  это есть в стандарте языка C99, 1999 года ... см. стандарт (и POSIX API). В реализациях C где-то есть в полной мере, где-то частично...

 

  

sadman41
Offline
Зарегистрирован: 19.10.2016

AVS пишет:
Но ведь char занимает 1 байт, разве нет?

.. А можете подсказать, как узнать вес того или иного массива?

Так будет понаглядней:

char c[] = "абвгд";

void setup() {
  Serial.begin(9600);
}

void loop() {
int i = 0;
  while (i < sizeof(c) ) {
    Serial.print("'");  Serial.print((char) c[i]);  Serial.print("' => ");
    Serial.println((byte) c[i], DEC);
    i = i + 1;
  }
  Serial.println("_____");
  delay(2000);
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

AVS пишет:
К сожалению я не могу разобраться... . Ну и желательно, чтобы 1 симпол занимал один байт

Я например в своих проектах работаю с кодировкой win1251 - пожалуйста 1 байт.

А уже вывод куда надо - преобразую на ходу

AVS
Offline
Зарегистрирован: 11.12.2017

но вроде как везде пишут, что char и byte занимают один байт..а тут получается, что занимает уже как int или long//

насчет длины массива  - понятно как вычислить его длину, яимел ввиду, что может есть функция, типа как в php, которая вычисляет прям вес

AVS
Offline
Зарегистрирован: 11.12.2017

оу, а подскажите, как использоватьь именно эту кодировку, я потому и спрашивал вначале, только одну ардуино использует кодировку или же подбирает автоматически или может мы сами можем выбрать

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Кодировки не "используют", ими пользуются разными в зависимости от задачи, показать что? Преобразование строки из одной в другую? Тупо цикл, тут где то на форуме было, мне с мобильника текст лень писать.

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

AVS пишет:

но вроде как везде пишут, что char и byte занимают один байт..а тут получается, что занимает уже как int или long//

И char и byte занимают 1 байт, всё верно, только символ, буква - это уже не эквивалент char.  Эквивалентность char и byte тянулась из ... какого-то дремучего 1970 года или ещё раньше. Все новые, современные языки программирования давно от этого отказались: Plan-9, Linux, Python, Go, Swift, Kotlin ... - везде UTF-8.

 

AVS
Offline
Зарегистрирован: 11.12.2017

а помойму изспользовать и пользовать это одно и то же. Как мне использовать именно win1251

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

AVS пишет:
Если вы мне предлагаете что-то весов в2 байта, то боюсь не подойдёт...

Какая вам разница что там вам предлагает стандарт? Стандарт предлагает, а вы - пользуйтесь.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

У вас Far есть? Посмотрите им .ino-файл скетча, где есть русские буквы, обратите в какой кодовой странице он сохранен, переключитесь на ANSI...

Принудительно вы можете в массиве задать ascii-коды, например так: char c[] = "\x80\x81\x82\x83";

AVS
Offline
Зарегистрирован: 11.12.2017

а, ну я понял, я б тое отказался, будь у меня оперативка 16 гб, а не 1 кб, а память исчислялась терабайтами) но ведь возможность использовать менее "емкие" кодировки все таки есть

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

AVS пишет:

а помойму изспользовать и пользовать это одно и то же. Как мне использовать именно win1251


Не знаю)
Наводящий вопрос : а что сделать то? Вывести в монитор порта или в СМС отправить или что?
Вот например использование, начиная с 341 строки древний код
http://arduino.ru/forum/proekty/arduino-bluetooth-klaviatura-s-shifrovan...

AVS
Offline
Зарегистрирован: 11.12.2017

far это файловый менеджер? в поиске он выходит первым

а вот насчет принудительного задавания это еще интереснее. Мне было бы удобнее самому попорядку задать каждой букве свой код(мне нужны то только все буквы и основные знаки препинания

я правильно вас, понял, букве а я могу задать код, например 1, и в дальнейшем у буквы а код будет всегда 1?

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

AVS пишет:

Мне было бы удобнее самому попорядку задать каждой букве свой код

Какой ужас!!!

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

AVS пишет:

far это файловый менеджер? в поиске он выходит первым

а вот насчет принудительного задавания это еще интереснее. Мне было бы удобнее самому попорядку задать каждой букве свой код(мне нужны то только все буквы и основные знаки препинания

я правильно вас, понял, букве а я могу задать код, например 1, и в дальнейшем у буквы а код будет всегда 1?


Тяжёлый случай (
Вы уверены что попали на нужный форум?
С программированием как вообще?
Каждое устройство отображает символ в зависимости от кода так как это задумали его создатели, а уж преобразовать из одного кода в другой ваша забота.
Задайте в поиске - таблица соответствия unicode win1251 utf8 - может быть тогда наглядно все понятно вам будет

sadman41
Offline
Зарегистрирован: 19.10.2016

AVS пишет:

far это файловый менеджер? в поиске он выходит первым

а вот насчет принудительного задавания это еще интереснее. Мне было бы удобнее самому попорядку задать каждой букве свой код(мне нужны то только все буквы и основные знаки препинания

я правильно вас, понял, букве а я могу задать код, например 1, и в дальнейшем у буквы а код будет всегда 1?

Far - это файловый менеджер, да. У него мощный редактор/просмотрщик. 

Не понимаю, что такое "задать букве код". Вы можете в строку поместить байты с определенными значениями (0..255) и потом засылать их в некоторое устройство. Как устройство их будет интерпретировать - вопрос второй.

AVS
Offline
Зарегистрирован: 11.12.2017

andycat пишет:
AVS пишет:

а помойму изспользовать и пользовать это одно и то же. Как мне использовать именно win1251

Не знаю) Наводящий вопрос : а что сделать то? Вывести в монитор порта или в СМС отправить или что? Вот например использование, начиная с 341 строки древний код http://arduino.ru/forum/proekty/arduino-bluetooth-klaviatura-s-shifrovaniem-speck#comment-306261
на данный момент мне просто нужно суметь получить адекватные еоды русских букв, 

надо посидеть с вашим кодом
AVS
Offline
Зарегистрирован: 11.12.2017

Olej пишет:

AVS пишет:

Мне было бы удобнее самому попорядку задать каждой букве свой код

Какой ужас!!!

 

может в дальнейшем я уйду от этого

AVS
Offline
Зарегистрирован: 11.12.2017

andycat пишет:
AVS пишет:

far это файловый менеджер? в поиске он выходит первым

а вот насчет принудительного задавания это еще интереснее. Мне было бы удобнее самому попорядку задать каждой букве свой код(мне нужны то только все буквы и основные знаки препинания

я правильно вас, понял, букве а я могу задать код, например 1, и в дальнейшем у буквы а код будет всегда 1?

Тяжёлый случай ( Вы уверены что попали на нужный форум? С программированием как вообще? Каждое устройство отображает символ в зависимости от кода так как это задумали его создатели, а уж преобразовать из одного кода в другой ваша забота. Задайте в поиске - таблица соответствия unicode win1251 utf8 - может быть тогда наглядно все понятно вам будет
ну в програмировании я обычный среднестатистический человек, в что не мегает мне решать простенькие вещи, но вот с кодировками я просто до этого совсем не был знаком(

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

AVS пишет:

andycat пишет:
AVS пишет:

а помойму изспользовать и пользовать это одно и то же. Как мне использовать именно win1251

Не знаю) Наводящий вопрос : а что сделать то? Вывести в монитор порта или в СМС отправить или что? Вот например использование, начиная с 341 строки древний код http://arduino.ru/forum/proekty/arduino-bluetooth-klaviatura-s-shifrovaniem-speck#comment-306261
на данный момент мне просто нужно суметь получить адекватные еоды русских букв, 

надо посидеть с вашим кодом

Получить адекватные коды Где??? Из чего??? Озвучте конкретное требование. ЗЫ : не надо с моим кодом сидеть - плохой пример, сейчас бы я все по другому написал.

AVS
Offline
Зарегистрирован: 11.12.2017

качаемс, посмотримс, ну а вообще, я так и хотел делать, на крайний случай, ведь запросто каждую букву можно обозвать числом и она спокойно влезет в 1 байт, разве что меня такой вопрос интересует. Что будет более емким char c[] = "эюя"; или byte c[] = '31','32','33';

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

AVS пишет:

качаемс, посмотримс, ну а вообще, я так и хотел делать, на крайний случай, ведь запросто каждую букву можно обозвать числом и она спокойно влезет в 1 байт, разве что меня такой вопрос интересует. Что будет более емким char c[] = "эюя"; или byte c[] = '31','32','33';


А второй вариант однобайтовый куда собираетесь выводить? Хранить компактно это только пол дела

AVS
Offline
Зарегистрирован: 11.12.2017

andycat пишет:
AVS пишет:

andycat пишет:
AVS пишет:

а помойму изспользовать и пользовать это одно и то же. Как мне использовать именно win1251

Не знаю) Наводящий вопрос : а что сделать то? Вывести в монитор порта или в СМС отправить или что? Вот например использование, начиная с 341 строки древний код http://arduino.ru/forum/proekty/arduino-bluetooth-klaviatura-s-shifrovaniem-speck#comment-306261
на данный момент мне просто нужно суметь получить адекватные еоды русских букв, 

надо посидеть с вашим кодом

Получить адекватные коды Где??? Из чего??? Озвучте конкретное требование. ЗЫ : не надо с моим кодом сидеть - плохой пример, сейчас бы я все по другому написал.
cкажем так, на каждую отдельную букву мне нужно делать свое отдельное действие. Для этого мне у каждой буквы нужно возиметь числовой код, а уже эот код будет соответствовать отпределенной позиции в другом массиве

AVS
Offline
Зарегистрирован: 11.12.2017

мне нужно перебирать текст, не более, выводить буквы, каждой букве будет назначено отдельное действие

второй вариант сложнее для восприятия, но можно написать програмулину, которая будет переводить обычный текс в это добро, встаили в ардуино,а дальше пусть сама

по емкости они оба занимают 3 байта?

AVS
Offline
Зарегистрирован: 11.12.2017

я как понимаю варианты с заменой одной кодировки на другую требуют постоянного пребора, того же for или while для каждого символа?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

AVS пишет:

я как понимаю варианты с заменой одной кодировки на другую требуют постоянного пребора, того же for или while для каждого символа?


Нет, я давал ссылку, никакого перебора, тупо математика, в конце концов - вы табличку в интернете соответствия кодировок посмотрели - совсем ведь просто

AVS
Offline
Зарегистрирован: 11.12.2017

не удите, таблицу я видел. Но ведь у вас в коед постоянно используется ф-я RusKeyTo1251

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

И? Но не цикл же по всей кодовой таблице.

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

AVS пишет:

ведь запросто каждую букву можно обозвать числом и она спокойно влезет в 1 байт

Кто Вам сказал эту глупость?

Попытайтесь запихнуть 54600 китайских иероглифов в 1 байт.

А для англосакса, что иероглифы, что кириллица - без разницы.

Собсвенно, исчерпывающий ответ для человепка, который умеет пользоваться поиском, я привел в ответе №1.

Но раз Вы поиском пользоваться не умеете, начните с этого: https://ru.wikipedia.org/wiki/UTF-8

Если будет непонятно... и после второго-третьего прочтения непонятно, походите по ссылкам: https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8

 

AVS
Offline
Зарегистрирован: 11.12.2017

Я так то писал, что нужен мне только русскиц

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

AVS, Вы уж определитесь, Вам нужно "каждую букву" или только кириллическую, Вам нужна своя собственная ни с чем не совместимая кодировка, или Вы хотите пользоваться какой-либо стандартной (например, utf-8).

AVS
Offline
Зарегистрирован: 11.12.2017

Но я ведь вроде писал, что мне нужны только русские и пара знаков, все в общем то) прошу прощения если выразился не так.

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

А на второй вопрос?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Главный вопрос так и не задали: А куда это нужно выводить? В смысле это экран, COM-порт, СМС, Web-сервер, блютус?

Это все очень разные темы, совсем разные. Некоторые экраны вообще не знают русского (к счастью), те, которые знают, имеют кучу разных шрифтов в разных кодировках.

И смежный вопрос - откура вводить эту абракадабру, сорри, кириллицу? В коде при программировании? Или при работе с какойц-то клавы? Или придет по СМС? Или по сети? Это тоже все совершенно разные вещи.

--------------------

Лучший выход - в жопу кириллицу (это проще), или учиться, учиться и еще раз учиться. Если хотим помощи, то точно описать свои задумки и хотелки, тебе подберут самый оптимальный вариант решения.