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

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

09.03.2020, 23:02. Показов 1236. Ответов 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
18273 / 14196 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 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
18273 / 14196 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru