CString в char[]
От: indee  
Дата: 16.03.18 12:06
Оценка:
Как строку CString конвертировать в char[]?


Спасибо!
Re: CString в char[]
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 16.03.18 12:19
Оценка: -1
Здравствуйте, indee, Вы писали:

I>Как строку CString конвертировать в char[]?


GetBuffer(), GetBufferSetLength()
Только это будет не char[], а TCHAR[]. Если надо именно char[], то в юникодном варианте потребуется ещё конвертация WideCharToMultiByte().
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: CString в char[]
От: Maniacal Россия  
Дата: 16.03.18 12:20
Оценка: +1
Здравствуйте, indee, Вы писали:

I>Как строку CString конвертировать в char[]?


I>Спасибо!


В TCHAR можно, потому как в зависимости от того UNICODE проект или нет CString хранит или char-строку или wchar_t-строку
CString str = _T("qwe");
const TCHAR* q = (LPCTSTR)str;


Вообще можно ещё проще:
CString str = _T("qwe");
const TCHAR* q = str;
Отредактировано 16.03.2018 12:21 Maniacal . Предыдущая версия .
Re: CString в char[]
От: Stanislav V. Zudin Россия  
Дата: 16.03.18 12:24
Оценка: +1
Здравствуйте, indee, Вы писали:

I>Как строку CString конвертировать в char[]?


0. С какой целью?

1. Если юникод выключен, то внутри CString будет лежать массив char'ов.
Смотри методы GetString() или GetBuffer().

2. Если юникод включен, то в CString "широкие" символы. Тогда либо кастить к char* (будет доступ к строке на уровне байтов), либо придется конвертировать в анси-строку (WideCharToMultiByte в помощь).
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: CString в char[]
От: indee  
Дата: 16.03.18 12:29
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, indee, Вы писали:


I>>Как строку CString конвертировать в char[]?


I>>Спасибо!


M>В TCHAR можно, потому как в зависимости от того UNICODE проект или нет CString хранит или char-строку или wchar_t-строку

M>
M>CString str = _T("qwe");
M>const TCHAR* q = (LPCTSTR)str;
M>

Error (active) E0413 no suitable conversion function from "CString" to "LPCSTR" exists


M>Вообще можно ещё проще:

M>
M>CString str = _T("qwe");
M>const TCHAR* q = str;
M>

Error C1001 An internal error has occurred in the compiler
Re[3]: CString в char[]
От: Maniacal Россия  
Дата: 16.03.18 12:33
Оценка:
Здравствуйте, indee, Вы писали:

M>>В TCHAR можно, потому как в зависимости от того UNICODE проект или нет CString хранит или char-строку или wchar_t-строку

M>>
M>>CString str = _T("qwe");
M>>const TCHAR* q = (LPCTSTR)str;
M>>

I>Error (active) E0413 no suitable conversion function from "CString" to "LPCSTR" exists

LPCTSTR
Внимательнее нужно быть.

LPCSTR = const char*
LPCTSTR = const TCHAR*
LPSTR = char*
LPTSTR = TCHAR*
Re[2]: CString в char[]
От: indee  
Дата: 16.03.18 12:51
Оценка:
С какой целью? OLE -> JNI
Re[3]: CString в char[]
От: Stanislav V. Zudin Россия  
Дата: 16.03.18 13:06
Оценка: 1 (1)
Здравствуйте, indee, Вы писали:

I>С какой целью? OLE -> JNI


В Яве строки юникодные (utf16).
Для начала стоит определиться, что именно нужно получить — массив байт, ANSI строку, utf-8 или utf-16?

Про JNI пишут, что там используется какое-то свое подмножество ютф8, для которого есть собственное АПИ, но разбираться лень.
_____________________
С уважением,
Stanislav V. Zudin
Re[4]: CString в char[]
От: indee  
Дата: 16.03.18 13:11
Оценка:
Из OLE получаю CString.
Re[5]: CString в char[]
От: Stanislav V. Zudin Россия  
Дата: 16.03.18 13:13
Оценка:
Здравствуйте, indee, Вы писали:

I>Из OLE получаю CString.


С ОЛЕ всё понятно, что нужно скормить в JNI? Что должно лежать в char[]?
_____________________
С уважением,
Stanislav V. Zudin
Re[6]: CString в char[]
От: indee  
Дата: 16.03.18 13:24
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, indee, Вы писали:


I>>Из OLE получаю CString.


SVZ>С ОЛЕ всё понятно, что нужно скормить в JNI? Что должно лежать в char[]?


в char[] должно лежать CString
Re[7]: CString в char[]
От: Stanislav V. Zudin Россия  
Дата: 16.03.18 13:30
Оценка: 1 (1)
Здравствуйте, indee, Вы писали:

SVZ>>С ОЛЕ всё понятно, что нужно скормить в JNI? Что должно лежать в char[]?


I>в char[] должно лежать CString


Мдя, исчерпывающе.

Если UCS2 (UTF16) устраивает, тогда вот так:

CString str;
char* pBytes = (char*)str.GetString();
size_t length = sizeof(TCHAR) * str.GetLength();


pBytes указывает на первый байт строки, которая лежит в CString.
length — длина в байтах.
_____________________
С уважением,
Stanislav V. Zudin
Re[8]: CString в char[]
От: indee  
Дата: 16.03.18 13:35
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, indee, Вы писали:


SVZ>>>С ОЛЕ всё понятно, что нужно скормить в JNI? Что должно лежать в char[]?


I>>в char[] должно лежать CString


SVZ>Мдя, исчерпывающе.


SVZ>Если UCS2 (UTF16) устраивает, тогда вот так:


SVZ>
SVZ>CString str;
SVZ>char* pBytes = (char*)str.GetString();
SVZ>size_t length = sizeof(TCHAR) * str.GetLength();
SVZ>

Error C1001 An internal error has occurred in the compiler
Re[9]: CString в char[]
От: Stanislav V. Zudin Россия  
Дата: 16.03.18 13:46
Оценка:
Здравствуйте, indee, Вы писали:

SVZ>>Если UCS2 (UTF16) устраивает, тогда вот так:


SVZ>>
SVZ>>CString str;
SVZ>>char* pBytes = (char*)str.GetString();
SVZ>>size_t length = sizeof(TCHAR) * str.GetLength();
SVZ>>

I>Error C1001 An internal error has occurred in the compiler

А это уже не ко мне, а к начальнику транспортного цеха.
Либо пересобрать проект, либо переустановить/обновить компилятор.
_____________________
С уважением,
Stanislav V. Zudin
Re: CString в char[]
От: VladFein США  
Дата: 16.03.18 20:40
Оценка:
Здравствуйте, indee, Вы писали:

I>Как строку CString конвертировать в char[]?


http://rsdn.org/forum/mfc/6642249
Автор: VladFein
Дата: 16.12.16
Re: CString в char[]
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 19.03.18 09:57
Оценка:
Здравствуйте, indee, Вы писали:

I>Как строку CString конвертировать в char[]?


Можно ещё вот так:

CString  mystr;
LPCTSTR  pzText;
char s[40]; // или любая другая длина--главное, чтобы в эту строку помещался результирующий текст
int  i, n;

// инициализация mystr;
n = mystr.GetLength();
pzText = mystr.GetBuffer();
for (i=0; i<n; i++)  s[i] = pzText[i];
s[n] = '\0'; // завершающий NULL-символ


Вместо

char s[40];


можно написать

char *s;
s = new char[40];
1613 г. = 2024 г.
Re[2]: CString в char[]
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 19.03.18 11:01
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>// инициализация mystr;

RF>n = mystr.GetLength();
RF>pzText = mystr.GetBuffer();
RF>for (i=0; i<n; i++) s[i] = pzText[i];
RF>s[n] = '\0'; // завершающий NULL-символ
RF>[/ccode]

И прощайте все юникодные символы за пределами семибитной ASCII. WideCharToMultiByte хотя бы символы из заданной кодовой страницы сохранит.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[4]: CString в char[]
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 19.03.18 12:26
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Для начала стоит определиться, что именно нужно получить — массив байт, ANSI строку, utf-8 или utf-16?


А чем, кстати, отличаются UTF-8 и UTF-16 ?
1613 г. = 2024 г.
Re[5]: CString в char[]
От: Stanislav V. Zudin Россия  
Дата: 19.03.18 12:30
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А чем, кстати, отличаются UTF-8 и UTF-16 ?


Судя по названию, размером символа.

UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования текста, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII.

utf8

UTF-16 (англ. Unicode Transformation Format) в информатике — один из способов кодирования символов из Юникода в виде последовательности 16-битных слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (суррогатная пара).

utf16
_____________________
С уважением,
Stanislav V. Zudin
Re: CString в char[]
От: indee  
Дата: 20.03.18 09:04
Оценка:
Спасибо за помощь!

Проблемма решена обновлением VS до версии 15.6.2.
В предыдущей версии 15.4.х вылазили кучи ошибок при любом упоминании CString.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.