powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / си строки в delphi
25 сообщений из 39, страница 1 из 2
си строки в delphi
    #39790318
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как корректно принять СИ строку (char *) в delphi ?

В Си char* может в себе хранить полноценный юникод.

PAnsiChar отпадает.
PWideChar(string) даёт китаёсщину

пока нашёл для себя такой вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
  TUTF8StringHelper = record helper for PUTF8String
    function AsString: string; inline;
  end;

function TUTF8StringHelper.AsString: string;
begin
  Result := String(UTF8String(PAnsiChar(Self)));
end;
...
Рейтинг: 0 / 0
си строки в delphi
    #39790319
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

надо разбираться, почему PWideChar(string) "даёт китаёсщину", вероятно что кодировка у строки получается не та
...
Рейтинг: 0 / 0
си строки в delphi
    #39790320
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcВ Си char* может в себе хранить полноценный юникод.

Не может. Для юникода есть wchar_t или накрайняк WCHAR. Тем, кто запихивает UTF-16 в char*
отрывают руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
си строки в delphi
    #39790322
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только для СиШников юникод в char* это норма. И все они, начиная от маленьких компаний до гигантов используют char*

https://ru.wikipedia.org/wiki/Символьный_тип

авторСимвольный тип (Сhar) — тип данных, предназначенный для хранения одного символа (управляющего или печатного) в определённой кодировке. Может являться как однобайтовым (для стандартной таблицы символов), так и многобайтовым (к примеру, для Юникода). Основным применением является обращение к отдельным знакам строки.

Я понимаю это как, что они умеют его просто напросто выводить правильно, без преобразований в виде конвертации. А работает это так же как и для обычной строки

...

Там массив байт идёт по порядку. К примеру
'Hello'#9787 что будет ровно 72, 101, 108, 108, 111, 1074, 152, 187
...
Рейтинг: 0 / 0
си строки в delphi
    #39790323
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
ShowMessage(UTF8String(PAnsiChar(#72#101#108#108#111#1074#152#187)));
...
Рейтинг: 0 / 0
си строки в delphi
    #39790339
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через отладчик глянул, он просто создал новую строку с кодом 65001 через _NewAnsiString и перенёс туда строку через move
...
Рейтинг: 0 / 0
си строки в delphi
    #39790340
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типа

Код: pascal
1.
2.
3.
4.
function TUTF8StringHelper.ToString(): UTF8String;
begin
  SetAnsiString(@Result, PAnsiChar(self), length(PAnsiChar(self)), 65001);
end;
...
Рейтинг: 0 / 0
си строки в delphi
    #39790343
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcТолько для СиШников юникод в char* это норма. И все они, начиная от маленьких компаний до гигантов используют char*Не все. А только те, кому руки отрывают.
По сути - это указатель на память, а в него, конечно, могли понаписать и юникодных строк, и структур DBF, и все что угодно.

Если ты уж точно уверен, что там юникод utf16 - тогда надо кастить например так: WideString( PWideChar( pStr ) ).
Это сработает, если строка точно нультерминальная. Иначе надо знать размер и формировать String самому (чз SetString например).
...
Рейтинг: 0 / 0
си строки в delphi
    #39790344
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcЧерез отладчик глянул, он просто создал новую строку с кодом 65001 через _NewAnsiString и перенёс туда строку через moveЗначит, похоже, это таки PAnsiChar. И AnsiString( pStr ) должно помочь.
...
Рейтинг: 0 / 0
си строки в delphi
    #39790346
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockНе все. А только те, кому руки отрывают.

Это может быть переданная страница из интернет ресурса, в кодировки UTF8 с содержанием юникода и иероглифов. Данные в конечном итоге попадают в обработчик

Насчёт чередований (p)(Ansi\Wide)String он выводил либо ☻ или же китаёсщину
...
Рейтинг: 0 / 0
си строки в delphi
    #39790350
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpcв кодировки UTF8 с содержанием юникода и иероглифов.

"Эт ты круто задвинул." Жги есчо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
си строки в delphi
    #39790352
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Ты думаешь я тут шутки шучу ?
...
Рейтинг: 0 / 0
си строки в delphi
    #39790353
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
си строки в delphi
    #39790365
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,
Перевод в char * в wstring делается так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
wstring chartowstring(char * s, UINT codepage)
  {
    if (s == NULL)
      return NULL;
    int size = MultiByteToWideChar(codepage, 0, s, -1, NULL, 0);
    std::wstring ws(size, L' ');
    MultiByteToWideChar(codepage, 0, s, -1, &ws[0], size);
    return ws;
  }


Далее
Код: plaintext
1.
2.
3.
4.
5.
6.
  HRESULT __stdcall GetDevice(BSTR & device)
  {
    string name = 'тут что-то';
    device = SysAllocString(chartowstring(&name[0], CP_UTF8).c_str());
    return S_OK;
  }


На Delphi будет код такой:
Код: pascal
1.
2.
3.
function GetDevice : WideString; safecall;
или
function GetDevice(out/var device: WideString) : HRESULT; stdcall;


в си char - в делфи ansichar
...
Рейтинг: 0 / 0
си строки в delphi
    #39790393
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014,

с самой кодировкой проблем нет, проблема отобразить данные правильно. Но как понимаю, это нереально сделать через 1 тип без копирования
...
Рейтинг: 0 / 0
си строки в delphi
    #39790414
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcТы думаешь я тут шутки шучу ?

Нет, я думаю, что ты очередной новичок, который первый раз встретился с удивительным миром
кодировок символов и тупит как и остальные его 100500 предшественников.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
си строки в delphi
    #39790417
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

если не знаешь, что такое UTF-8, почитай про эту кодировку, в ней разные символы кодируются разным количеством байтов.
...
Рейтинг: 0 / 0
си строки в delphi
    #39790419
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=_= В сях char* строки UTF8 - 4 СИМВОЛА Юникод. И 3 байта русские буквы

Аналог в Delphi нашёл UTF8String но корректно Delphi не умеет его отображать от Сей

По этому приходится выполнять Хак UTF8String(PAnsiChar(PUTF8String))

Именно по этому я и задал тут вопроc, как корректно принять строку, и возможно ли это без хака


А вы тут перекодировку строк суёте, глагольствуете мол новичок и не знает что такое UTF8

Я точно знаю одно, Delphi без костылей не работает с UTF8 которые пришли от Сей
...
Рейтинг: 0 / 0
си строки в delphi
    #39790420
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

TEncoding.UTF8.GetString?
...
Рейтинг: 0 / 0
си строки в delphi
    #39790424
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asviridenkov,

Хак UTF8String(PAnsiChar(PUTF8String)) работает. Я не хочу этот хак менять на другой хак.

Тем более когда другой во много раз хуже по производительности
...
Рейтинг: 0 / 0
си строки в delphi
    #39790432
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asviridenkov,

хотя если посудить. То это полный аналог Utf8ToUnicodeString я тут глянул. Те же самые функции вызывает... Так что смысла особого вообще нет в TEncoding
...
Рейтинг: 0 / 0
си строки в delphi
    #39790433
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc=_= В сях char* строки UTF8 - 4 СИМВОЛА Юникод.
...
...

А вы тут перекодировку строк суёте, глагольствуете мол новичок и не знает что такое UTF8

Я точно знаю одно, Delphi без костылей не работает с UTF8 которые пришли от Сей
Почитай всё-таки про Юникод и UTF-8, уясни для себя базовые понятия, а то что-то странное написал.

Юникод - это способ кодирования символов, когда каждому символу из всевозможных языков, математическим символам и т.д. присваивается определенный номер (CodePoint), в Юникоде их больше миллиона.
Далее, есть разные способы записывать строки как последовательности символов в виде последовательностей байтов. Это называется UTF (Unicode Transformation Format). В UTF-16 символ записывается последовательностью из 2 байт для первых 256*256=65536 символов, а потом - парами 2 по 2 байта. (не совсем так, но совсем грубо говоря, примерно так). В UTF-8 первые 127 символов кодируются 1 байтом, потом есть диапазон, который кодируется 2 байтами, затем, следующие символы кодируются 3 байтами, потом - 4 (раньше было до 6). Номера символов (Unicode Codepoint) одни и те же и в UTF-8 и в UTF-16, но кодируются в последовательности байт по-разному. Есть ещё UTF-32, где каждый символ кодируется 4 байтами.
В Windows API для юникода используется UTF-16.
...
Рейтинг: 0 / 0
си строки в delphi
    #39790436
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62,

А теперь пожалуйста объясни мне, не посещённому в Юникод, почему если я напишу

Код: pascal
1.
2.
3.
4.
5.
function ZStr(p: Pointer): UTF8String; = NULL 
function ZStr(p: Pointer): PUTF8String; = Addres : Смотреть ниже
function ZStr(p: Pointer): PAnsiChar; = Ok☀
function ZStr(p: Pointer): PWideChar; = 歏飢€
function ZStr(p: Pointer): STRING; = 歏飢



И в итоге, что бы получить желаемое, надо сделать хак
- UTF8String(PAnsiChar(PUTF8String))

Ведь в итоге он просто создаст Ansi строку, и перепишет туда символы через move

Аналогично
SetAnsiString(@Result, PAnsiChar(self), length(PAnsiChar(self)), 65001);
...
Рейтинг: 0 / 0
си строки в delphi
    #39790441
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

Я не понял, что у тебя за функция ZStr, но вообще компилятор и RTL Дельфи делают со строками разные преобразования. В переменной типа строка, кроме данных, хранится дополнительная информация (по отрицательному смещению) - длина, количество ссылок, кодовая страница. У UTF-8 кодовая страница как раз 65001. И когда потом с этой строкой делаются какие-то операции, кодировка учитывается. VCL использует внутренее представление строк в UTF-16. И когда строка выводится куда-нибудь, то Дельфи неявно преобразует строку в UTF-16. Если у тебя кодовая страница указана UTF-8, то она строку правильно преобразует и выведет, а если указано что-то другое, то Дельфи будет думать, что там строка в другом формате и преобразует ее неправильно.
И при начальном присвоении, тоже наверное могут быть какие-то такого рода эффекты.

Мне кажется, что корректный и понятный способ - который sviridenkov написал.
...
Рейтинг: 0 / 0
си строки в delphi
    #39790444
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62,

А чем Utf8ToUnicodeString отличается от TEncoding.UTF8.GetString ?
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / си строки в delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]