Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236

Как из system string вытащить ascii с русскими символами?

09.03.2020, 23:02. Показов 1265. Ответов 4

Студворк — интернет-сервис помощи студентам
В в общем передо мной стоит такая задача: из визуального компонента такого как richtextbox вытащить содержащийся в нём текст и поместить его в обычный массив типа char после чего этот массив в числе прочего будет передан через серийный порт.
В общем получается что передать массив в серийный порт у меня получилось но вот как переконвертировать string^ char*
непонятно.

Я почитал прикреплённую тему о преобразовании типов и понял что её писали не для понимания а для чего то другого.


вот приведённый пример System::String^ в char*, wchar_t* и обратно # :

C++
1
2
3
4
5
6
7
8
9
10
11
#include <clocale>
#include <msclr/marshal.h>
using namespace System;
using namespace msclr::interop;
 
int main() {
    char* loc = setlocale(LC_ALL, NULL);
    String^ text = marshal_as<String^>(loc);
    Console::WriteLine(text);
    return 0;
}
что делает этот код? нет ни строки которую преобразуем ни результата.
вот такой код:
C++
1
2
char* text_char =new char[20];
String^ text= marshal_as<char*>(text_char);
даёт ошибку из заголовочного файла маршалинга мол мы сие делать не могём, придумайте сами как это сделать да ?
Представляете себе ребятки писали библиотеку для конвертации строк и бедненькие забыли что весь смысл библиотеки это совместимость данных обычных плюсов и ихнего мокрософта. Как так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2020, 23:02
Ответы с готовыми решениями:

Конфузы с русскими буквами при переводе из System::String^ в std::string
Использую такую конструкцию: string stdstr; for(int i=0;i&lt;sysstr-&gt;Length;++i) stdstr+=sysstr; Для английского текста все...

Как из символа строки System::String^ получить его ASCII код
Здравствуйте! Подскажите, пожалуйста, как из символа строки System::String^ получить его ASCII код. Вот на std::string это делается...

Как работать с русскими символами ?
мне не надо setlocale у меня в массив левая херь записывается не то что я ввожу. С англ все норм

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
12.03.2020, 10:07
Цитата Сообщение от Святогор Посмотреть сообщение
C++
7
8
9
    char* loc = setlocale(LC_ALL, NULL);
    String^ text = marshal_as<String^>(loc);
    Console::WriteLine(text);
что делает этот код? нет ни строки которую преобразуем ни результата.
Преобразует char* в String^. Переменная loc входное значение, text результат.

Цитата Сообщение от Святогор Посмотреть сообщение
вот такой код:
C++
1
2
char* text_char =new char[20];
String^ text= marshal_as<char*>(text_char);
даёт ошибку из заголовочного файла маршалинга мол мы сие делать не могём, придумайте сами как это сделать да ?
1) Тип-аргумент для marshal_as указывает тип в который нужно преобразовать. Его он и вернет.
2) В статье которую ты упоминал ясно сказано что при преобразовании из String^ можно использовать только const типы
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Преобразование System::String^ возможно только в указатели на константу, т.е. в const char* и в const wchar_t* и с использованием marshal_context::marshal_as().
Соотвественно код решения задачи будет таким
C++
1
auto chars = marshal_as<const char*>(richTextBox1->Text);
Цитата Сообщение от Святогор Посмотреть сообщение
Как из system string вытащить ascii с русскими символами?
В кодировке ASCII нет русских символов. Они есть только в некоторых расширенных ASCII кодировках.

Добавлено через 13 минут
Небольшая поправка к примеру. Похоже для преобразования в const char* нужно использовать класс marshal_context. Он используется в случаях когда возвращаемый тип не имеет деструктора. Возвращаемое значение удаляется при удалении экземпляра marshal_context. Чтобы сохранить результат дольше нужно скопировать его в другую переменнную. Собственно несложно написать метод который это будет делать.
C++
1
2
3
4
5
marshal_context^ context = gcnew marshal_context();
String^ message = gcnew String("Test String to Marshal");
const char* result;
result = context->marshal_as<const char*>( message );
delete context;
1
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
15.03.2020, 22:27  [ТС]
Через контекст маршалинга всё получилось. Но тут есть принципиально важный момент.
Нужно использовать получившуюся строку const char * до команды delete context; Потому что после неё массив исчезает.

Что касается русских символов..... Если пересылать введённое например в richtextbox в серийный порт методом writeline
то действительно русских символов не будет, а вместо них квадратики. Но, если по предложенному вами способу преобразовать код в const char* а потом перегнать его в управляемый массив типа byte и с помощью метода серийного порта Write(buf,offset,length); закинуть в серийный порт, то все русские символы прекрасно отправляются в ascii кодировке.

Судя по всему русские символы в ascii хранятся с номерами больше 128. И они расположены примерное также как и английские согласно стандарту кои 7 или кои 8 я так и не понял до конца. По стандарту так и должно быть коды больше 128 хранят национальные кодировки.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
16.03.2020, 00:46
Цитата Сообщение от Святогор Посмотреть сообщение
Нужно использовать получившуюся строку const char * до команды delete context; Потому что после неё массив исчезает.
Я именно об этом и писал:
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Возвращаемое значение удаляется при удалении экземпляра marshal_context.
Цитата Сообщение от Святогор Посмотреть сообщение
Судя по всему русские символы в ascii хранятся с номерами больше 128.
Еще раз - в ASCII нет русских символов. Если они там есть, то какая-то другая кодировка.
0
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
16.03.2020, 21:14  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Еще раз - в ASCII нет русских символов. Если они там есть, то какая-то другая кодировка.
Пожалуй соглашусь с вами.ASCII это чисто англоязычная хреновина. В данном случае похоже кодировка получается Windows-1251. То есть в 1 байт упакованы и русские и английские буквы при этом коды с 0 по 128 совпадают с ascii.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2020, 21:14
Помогаю со студенческими работами здесь

Как в Memo вводить текст русскими символами?
Я ввожу текст в Memo, а он отображается закирилинными, как исправить?

Как решить проблему с русскими символами в консоли
Как решить проблему с русскими символами в консоли? Читаю файл в CP1251, вывожу сразу в консоль - получаю &quot;?aR??a?&quot; вместо...

Как реализовать сравнение строк с русскими символами
Дело обстоит так: Нужно сравнить на сходство русские слова. Пробовал strcmp - но она что-то лениться с не англоязычными символами работать...

Как в ОС с англоязычной локализацией запустить консоль с русскими символами?
Имеется консольная программа с русскими символами. При запуске вместо них знаки вопроса. Как можно не меняя локализацию/язык системы...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru