17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236

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

09.03.2020, 23:02. Показов 1261. Ответов 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
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 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
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 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 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru