Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
16 / 16 / 10
Регистрация: 13.02.2013
Сообщений: 75
1

Может ли char хранить русские символы?

06.10.2015, 20:25. Показов 5650. Ответов 13
Метки нет (Все метки)

Доброго времени суток! Просьба прояснить некоторые нюансы.
Допустим мне нужна однобайтовая кодировка русских букв. char может хранить в себе такие символы, они лежат в отрицательных значениях например символ 'п' это число - 17. Но при попытке вывести на ShowMessage выводится какой-то инородный символ
C++
1
2
char str = 'п';
ShowMessage(str);
но если чар явно преобразовать в AnsiString, то выведется то что ожидается
C++
1
2
char str = 'п';
ShowMessage(AnsiString(str));
так же если присвоить чару указатель на константную строку, то все в порядке
C++
1
2
const char* str = "привет";
ShowMessage(str);
Но в данном случае получается, что он хранит в себе адрес этой строки. Не смотря на то что Функция принимает юникод строку, в памяти процесса видно, что под каждый символ выделился 1 байт EF F0 E8 E2 E5 F2. Следовательно вывод? Он может только указывать на русские символы, а хранить их не может или как?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2015, 20:25
Ответы с готовыми решениями:

Русские символы в массиве char
имеется функция возвращающая массив байтов(символов), если данная строка английское слово то все...

Не распознаёт русские символы типа char
Не распознаёт русские символы типа char setlocale(LC_ALL, "Rus"), setlocale(LC_ALL, "ru"),...

UTF-8 - русские символы в char посимвольно
Здравствуйте, в проекте используется UTF-8, и в char и в string я не могу обратиться к русскому...

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

13
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
06.10.2015, 20:37 2
Что такое "однобайтовая кодировка русских букв"?
char это один байт, ASCII/ANSI символ. Число от 0 до 255.
получается, что он хранит в себе адрес этой строки
Адрес первого символа из массива символов.
0
16 / 16 / 10
Регистрация: 13.02.2013
Сообщений: 75
06.10.2015, 20:48  [ТС] 3
Цитата Сообщение от UI-Maker Посмотреть сообщение
Что такое "однобайтовая кодировка русских букв"?
Кодировка занимающая 1 байт, в которой присутствуют русские символы.

Цитата Сообщение от UI-Maker Посмотреть сообщение
char это один байт, ASCII/ANSI символ. Число от 0 до 255.
Адрес первого символа из массива символов.
ну да, адрес первого элемента, не правильно выразился. В том то и дело, что диапазон char –128 до 127. unsigned char 0 до 255. Но меня интересует именно char. Вопросы озвучил в первом посте.
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
06.10.2015, 20:58 4
Версия Билдера? Юникодный или старый? Почему бы просто не использовать AnsiString?
Наверное просто функция не рассчитана на такой вызов.
В том то и дело, что диапазон char –128 до 127. unsigned char 0 до 255.
Это не суть важно. Нюансы типов.
0
16 / 16 / 10
Регистрация: 13.02.2013
Сообщений: 75
06.10.2015, 21:21  [ТС] 5
Цитата Сообщение от UI-Maker Посмотреть сообщение
Версия Билдера? Юникодный или старый? Почему бы просто не использовать AnsiString?
Наверное просто функция не рассчитана на такой вызов.
C++ Builder XE, поддержка юникода конечно есть. Хочется работать со строками на более низком уровне. Я пробовал и на мемо вывести, результат один и тот же
Цитата Сообщение от UI-Maker Посмотреть сообщение
Это не суть важно. Нюансы типов.
Почему не важно Как-то связано с переполнением? знаковый тип приводится к без знаковому?
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
07.10.2015, 12:12 6
Цитата Сообщение от alexeyj Посмотреть сообщение
char может хранить в себе такие символы
char не может хранить в себе символы. char это целочисленный тип. Целочисленный тип, который по умолчанию интерпретируется системой как символьный.
Цитата Сообщение от alexeyj Посмотреть сообщение
лежат в отрицательных значениях например символ 'п' это число - 17
Используйте unsigned char, чтобы не заблуждаться по поводу отрицательного размещения чего-то там.
Цитата Сообщение от alexeyj Посмотреть сообщение
при попытке вывести на ShowMessage выводится какой-то инородный символ
Как это работает:
char может хранить значения от нуля до 255. Всего двести пятьдесят шесть штук. Значение "-17" в без знаковом эквиваленте равно "239" (256-17=239). Операционная система берет из текущей кодовой страницы (поскольку у нас не используется юникод) значение 239, которое в шестнадцатеричном представлении выглядит как EF (пересечение строки E и столбца F: https://ru.wikipedia.org/wiki/Windows-1251), и выводит оттуда соответствующий символ. В данном случае это маленькая "п".
Никакой магии.

Цитата Сообщение от alexeyj Посмотреть сообщение
если чар явно преобразовать в AnsiString, то выведется то что ожидается
AnsiString это очень мощный класс, имеющий полтора десятка конструкторов, учитывающих всевозможные конвертации. Вчастности, при подсовывании ему именно юникодного символа (wchar_t), он сконвертирует его в соответствующий юникодный WideString. Внешне разницы вы не заметите.

Цитата Сообщение от alexeyj Посмотреть сообщение
Не смотря на то что Функция принимает юникод строку
Если вы про функцию ShowMessage, то она принимает именно AnsiString. Про юникод она ничего не знает. Почему это все ж работает написано чуть выше.

Цитата Сообщение от alexeyj Посмотреть сообщение
Следовательно вывод? Он может только указывать на русские символы, а хранить их не может или как?
Указывать он может даже на греческие символы. При использовании кодовой страницы 1253 - выдаст символ "о". И на что угодно, что прописано в именно текущей кодовой странице.

Итог: компьютер хранит числа. Не буквы, не символы. Числа. А вот как их интерпретировать это дело уже другое.
Используйте юникод, если хотите избежать множества проблем. Юникод можно себе представить как ту же самую кодовую таблицу, но просто огромных размеров. На столько огромных, что туда китайский алфавит поместился почти весь. Вместе с остальными.
1
16 / 16 / 10
Регистрация: 13.02.2013
Сообщений: 75
07.10.2015, 16:57  [ТС] 7
SatanaXIII, спасибо за ответ. Вы немного прояснили некоторые моменты, но вопросы все же остались.
ShowMessage у меня принимает Unicode строку, не знаю как у вас (скриншот 1)
Насчет инородного символа (скриншот 2)
Миниатюры
Может ли char хранить русские символы?   Может ли char хранить русские символы?  
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
07.10.2015, 17:16 8
Цитата Сообщение от alexeyj Посмотреть сообщение
ShowMessage у меня принимает Unicode строку
Да. Прошу меня извинить. Это в старых версиях было.
Цитата Сообщение от alexeyj Посмотреть сообщение
Насчет инородного символа
Попробуйте вот так:
C++
ShowMessage( (char)c );
0
16 / 16 / 10
Регистрация: 13.02.2013
Сообщений: 75
07.10.2015, 17:36  [ТС] 9
C++
1
ShowMessage( (char)c );
К сожалению, тоже самое. Русские символы напрочь отказывается выводить.
0
1404 / 567 / 127
Регистрация: 31.10.2011
Сообщений: 1,955
07.10.2015, 21:53 10
alexeyj, а в чем, собственно, проблема?
Если используется юникодный(2009+) билдер, то используй wchar_t вместо char.
А если нужно именно char, та чем вариант с AnsiString(str)?
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
08.10.2015, 09:04 11
Цитата Сообщение от alexeyj Посмотреть сообщение
К сожалению, тоже самое. Русские символы напрочь отказывается выводить.
Ладушки:
C++
ShowMessage( AnsiString( c ) );

alexeyj, чего вы хотите добиться вообще? Просто балуетесь или что-то определенное?
0
16 / 16 / 10
Регистрация: 13.02.2013
Сообщений: 75
08.10.2015, 15:19  [ТС] 12
SatanaXIII, хочу правильно научиться работать с си строками, для этого нужно было прояснить некоторые моменты
0
Заблокирован
Эксперт C
08.10.2015, 23:15 13
Цитата Сообщение от alexeyj Посмотреть сообщение
хочу правильно научиться работать с си строками,
Приведение типов - штука путанная. При использовании полиморфных функций запутанность возводится в квадрат.
Мой вам добрый совет - не ходите вглубь этого лабиринта, держитесь поближе к свету. Получился адекват - скажите спасибо, и ладушки.
Конечно, если в ваши задачи не входит напрямую именно изучение энтого лабиринта и подробный отчет о его граблях.
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
08.10.2015, 23:35 14
Увы, у меня нет вашей версии IDE, не могу поковырять. Скорее всего функция ShowMessage не понимает что в неё передали, возможно думает что это юникод или указатель.
Передайте в функцию, ожидающую Ansi символы. Например MessageBoxA().
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2015, 23:35

Широкие символы wchar_t wstring не хотят принимать русские символы
Собственно вопрос в шапке, вот примеры: std::wstring str = L"блин комом"; и такое: wchar_t...

Символы char, с 128 до 159 - пустые символы
такая вот строка: int i; char c = (char)i; при этом при значении i до 128, всё идёт по таблице...

Русские буквы в c++ char
Здравствуйте, уже все облазил так ничего не нашел и не понял, нужно понять одну простую вещь,...

Русские буквы в char
Здравствуйте! Имею потребность хранить слова из русских букв, быстро удалять и добавлять в слова...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.