ƒобро пожаловать в форум, Guest††>>†† ¬ойти†|†–егистрац舆| ѕоиск†|†ѕравила†| ¬ избранное | ѕодписатьс€
¬се форумы / Delphi Ќовый топик †† ќтветить
“опик располагаетс€ на нескольких страницах: 1 2      [все]
 си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
 ак корректно прин€ть —» строку (char *) в delphi ?

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

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

пока нашЄл дл€ себ€ такой вариант
type
  TUTF8StringHelper = record helper for PUTF8String
    function AsString: string; inline;
  end;

function TUTF8StringHelper.AsString: string;
begin
  Result := String(UTF8String(PAnsiChar(Self)));
end;
22 мар 19, 22:08††††[21841353]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
makhaon
Member

ќткуда: A galaxy far far away
—ообщений: 3262
Foxpc,

надо разбиратьс€, почему PWideChar(string) "даЄт китаЄсщину", веро€тно что кодировка у строки получаетс€ не та
22 мар 19, 22:12††††[21841354]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Dimitry Sibiryakov
Member

ќткуда:
—ообщений: 47665

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

Ќе может. ƒл€ юникода есть wchar_t или накрайн€к WCHAR. “ем, кто запихивает UTF-16 в char*
отрывают руки.

Posted via ActualForum NNTP Server 1.5

22 мар 19, 22:12††††[21841355]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
“олько дл€ —иЎников юникод в char* это норма. » все они, начина€ от маленьких компаний до гигантов используют char*

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

автор
—имвольный тип (—har) Ч тип данных, предназначенный дл€ хранени€ одного символа (управл€ющего или печатного) в определЄнной кодировке. ћожет €вл€тьс€ как однобайтовым (дл€ стандартной таблицы символов), так и многобайтовым (к примеру, дл€ ёникода). ќсновным применением €вл€етс€ обращение к отдельным знакам строки.


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

...

“ам массив байт идЄт по пор€дку.   примеру
'Hello'#9787 что будет ровно 72, 101, 108, 108, 111, 1074, 152, 187
22 мар 19, 22:26††††[21841359]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
ShowMessage(UTF8String(PAnsiChar(#72#101#108#108#111#1074#152#187)));
22 мар 19, 22:28††††[21841361]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
„ерез отладчик гл€нул, он просто создал новую строку с кодом 65001 через _NewAnsiString и перенЄс туда строку через move
23 мар 19, 00:23††††[21841411]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
“ипа

function TUTF8StringHelper.ToString(): UTF8String;
begin
  SetAnsiString(@Result, PAnsiChar(self), length(PAnsiChar(self)), 65001);
end;
23 мар 19, 00:33††††[21841414]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
YuRock
Member

ќткуда: ƒонецк
—ообщений: 3940
Foxpc
“олько дл€ —иЎников юникод в char* это норма. » все они, начина€ от маленьких компаний до гигантов используют char*
Ќе все. ј только те, кому руки отрывают.
ѕо сути - это указатель на пам€ть, а в него, конечно, могли понаписать и юникодных строк, и структур DBF, и все что угодно.

≈сли ты уж точно уверен, что там юникод utf16 - тогда надо кастить например так: WideString( PWideChar( pStr ) ).
Ёто сработает, если строка точно нультерминальна€. »наче надо знать размер и формировать String самому (чз SetString например).
23 мар 19, 00:55††††[21841421]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
YuRock
Member

ќткуда: ƒонецк
—ообщений: 3940
Foxpc
„ерез отладчик гл€нул, он просто создал новую строку с кодом 65001 через _NewAnsiString и перенЄс туда строку через move
«начит, похоже, это таки PAnsiChar. » AnsiString( pStr ) должно помочь.
23 мар 19, 00:57††††[21841422]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
YuRock
Ќе все. ј только те, кому руки отрывают.


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

ЌасчЄт чередований (p)(Ansi\Wide)String он выводил либо вШї или же китаЄсщину
23 мар 19, 01:13††††[21841427]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Dimitry Sibiryakov
Member

ќткуда:
—ообщений: 47665

Foxpc
в кодировки UTF8 с содержанием юникода и иероглифов.

"Ёт ты круто задвинул." ∆ги есчо.

Posted via ActualForum NNTP Server 1.5

23 мар 19, 01:59††††[21841441]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
Dimitry Sibiryakov,

“ы думаешь € тут шутки шучу ?

  сообщению приложен файл. –азмер - 81Kb
23 мар 19, 02:11††††[21841445]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152


  сообщению приложен файл. –азмер - 74Kb
23 мар 19, 02:11††††[21841446]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
ziv-2014
Member

ќткуда:
—ообщений: 342
Foxpc,
ѕеревод в char * в wstring делаетс€ так
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;
  }

ƒалее
  HRESULT __stdcall GetDevice(BSTR & device)
  {
    string name = 'тут что-то';
    device = SysAllocString(chartowstring(&name[0], CP_UTF8).c_str());
    return S_OK;
  }

Ќа Delphi будет код такой:
function GetDevice : WideString; safecall;
или
function GetDevice(out/var device: WideString) : HRESULT; stdcall;

в си char - в делфи ansichar
23 мар 19, 09:19††††[21841526]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
ziv-2014,

с самой кодировкой проблем нет, проблема отобразить данные правильно. Ќо как понимаю, это нереально сделать через 1 тип без копировани€
23 мар 19, 11:16††††[21841587]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Dimitry Sibiryakov
Member

ќткуда:
—ообщений: 47665

Foxpc
“ы думаешь € тут шутки шучу ?

Ќет, € думаю, что ты очередной новичок, который первый раз встретилс€ с удивительным миром
кодировок символов и тупит как и остальные его 100500 предшественников.

Posted via ActualForum NNTP Server 1.5

23 мар 19, 13:38††††[21841651]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
s62
Member

ќткуда: ∆уковский
—ообщений: 947
Foxpc,

если не знаешь, что такое UTF-8, почитай про эту кодировку, в ней разные символы кодируютс€ разным количеством байтов.
23 мар 19, 13:50††††[21841658]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
=_= ¬ с€х char* строки UTF8 - 4 —»ћ¬ќЋј ёникод. » 3 байта русские буквы

јналог в Delphi нашЄл UTF8String но корректно Delphi не умеет его отображать от —ей

ѕо этому приходитс€ выполн€ть ’ак UTF8String(PAnsiChar(PUTF8String))

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


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

я точно знаю одно, Delphi без костылей не работает с UTF8 которые пришли от —ей
23 мар 19, 14:16††††[21841665]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
asviridenkov
Member

ќткуда:
—ообщений: 3917
Foxpc,

TEncoding.UTF8.GetString?
23 мар 19, 14:17††††[21841667]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
asviridenkov,

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

“ем более когда другой во много раз хуже по производительности
23 мар 19, 14:28††††[21841672]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
asviridenkov,

хот€ если посудить. “о это полный аналог Utf8ToUnicodeString € тут гл€нул. “е же самые функции вызывает... “ак что смысла особого вообще нет в TEncoding
23 мар 19, 14:42††††[21841682]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
s62
Member

ќткуда: ∆уковский
—ообщений: 947
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.
23 мар 19, 14:43††††[21841683]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
s62,

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

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);
23 мар 19, 14:53††††[21841686]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
s62
Member

ќткуда: ∆уковский
—ообщений: 947
Foxpc,

я не пон€л, что у теб€ за функци€ ZStr, но вообще компил€тор и RTL ƒельфи делают со строками разные преобразовани€. ¬ переменной типа строка, кроме данных, хранитс€ дополнительна€ информаци€ (по отрицательному смещению) - длина, количество ссылок, кодова€ страница. ” UTF-8 кодова€ страница как раз 65001. » когда потом с этой строкой делаютс€ какие-то операции, кодировка учитываетс€. VCL использует внутренее представление строк в UTF-16. » когда строка выводитс€ куда-нибудь, то ƒельфи не€вно преобразует строку в UTF-16. ≈сли у теб€ кодова€ страница указана UTF-8, то она строку правильно преобразует и выведет, а если указано что-то другое, то ƒельфи будет думать, что там строка в другом формате и преобразует ее неправильно.
» при начальном присвоении, тоже наверное могут быть какие-то такого рода эффекты.

ћне кажетс€, что корректный и пон€тный способ - который sviridenkov написал.
23 мар 19, 15:30††††[21841697]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
s62,

ј чем Utf8ToUnicodeString отличаетс€ от TEncoding.UTF8.GetString ?
23 мар 19, 15:39††††[21841700]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
s62
Member

ќткуда: ∆уковский
—ообщений: 947
Foxpc,

Ќе знаю. я вообще написал сначала про пон€ти€ юникод и UTF-8, потому что показалось, что ты как-то их используешь не в общеприн€том смысле. ј вникать в детали задачи неохота, суббота впридачу. :)
23 мар 19, 15:45††††[21841703]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
ziv-2014
Member

ќткуда:
—ообщений: 342
Foxpc
s62,

ј чем Utf8ToUnicodeString отличаетс€ от TEncoding.UTF8.GetString ?

»спользуй второй вариант.
23 мар 19, 16:16††††[21841706]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
asviridenkov
Member

ќткуда:
—ообщений: 3917
Foxpc
“ак что смысла особого вообще нет в TEncoding


—мысл в том, что это универсальный централизованный способ перекодировани€.
23 мар 19, 18:03††††[21841734]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
asviridenkov,

Ѕред. ќни одинаковые. ќдна и та же функци€ вызываетс€ - MultiByteToWideChar

Ќикакой универсальности нету, кроме того что сам класс поддерживает разный сборник кодировок.
23 мар 19, 22:40††††[21841799]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
makhaon
Member

ќткуда: A galaxy far far away
—ообщений: 3262
Foxpc,
особенно интересно будет MultiByteToWideChar увидеть не на windows.
23 мар 19, 23:59††††[21841822]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
makhaon,

штука и не пишетс€ не дл€ винды
24 мар 19, 00:47††††[21841829]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
white_nigger
Member

ќткуда: “ула
—ообщений: 2114
Foxpc
штука и не пишетс€ не дл€ винды
"“акое впечатление, что вы бредите" (с) ¬роде русским €зыком всЄ объ€снили...
24 мар 19, 11:56††††[21841951]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
white_nigger,

ƒа в прочем оп€ть же бреееееед. ƒаже если € захочу скомпилировать под другую систему Ћинкус или андройда.

 омпил€тор сразу подхватит другую реализацию этой же функции. “ак что какать хотел на это, и на вашу псевдо универсальность ( оторой нет)
24 мар 19, 15:54††††[21842142]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Arioch
Member

ќткуда:
—ообщений: 10837
Foxpc
TEncoding.UTF8.GetString


TEncoding - это та ещЄ весЄла€ зараза. я понимаю желани€ копипастить C# ен включа€ мозга, но не в RTL же!

кстати, попробуй ей скормить испорченную UTF-8 строку

например вырежи из неЄ один байт наугад.

или проще всего

var u8s : AnsiString = 'start is correct UTF-8 bytestream for a while но потом внезапно a small non-Unicode piece';
     u16s: string;
     b: TByteStresm;

b.WriteBuffer(s[1], Length(s)+1);
u16s := TEncoding.UTF8.GetString(b.Bytes); 


угадай, что будет в u16s (и вообще, дойдЄт ли программа до этой строчки)

потом сравни с другими вариантами конвертировани€ этой намеренно подпорченной строки, начина€ с MultiByteToWideChar, древним UTF8Decode и т.д.
26 мар 19, 12:17††††[21843585]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
Arioch,


у мен€ были проблемы, что отладчик видит значени€. ј вывести в консоль не может. » условие str = nil давала true

я так и не пон€л причину, просто переписал код как было
26 мар 19, 13:53††††[21843738]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
X-Cite
Member

ќткуда: ћинск
—ообщений: 1435
Arioch
кстати, попробуй ей скормить испорченную UTF-8 строку

например вырежи из неЄ один байт наугад.

потом сравни с другими вариантами конвертировани€ этой намеренно подпорченной строки, начина€ с MultiByteToWideChar, древним UTF8Decode и т.д.


“о что что-то не€вно решало проблемы, и вдруг перестало решать - не означает что работало верно.
≈сли скормили кривую строку - то и должны получить кривой результат.
ѕередай нормальную строку - получишь нормальный результат.
¬се логично.
26 мар 19, 13:59††††[21843749]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
X-Cite,

UTF8String(PAnsiChar(PUTF8String)) даже бинарные строки, и обычные жуЄт верно
26 мар 19, 14:10††††[21843771]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Arioch
Member

ќткуда:
—ообщений: 10837
прекрасна€ логика.

ѕо ней код
x := 1; y := 0; z := x / y; 
может выдавать всЄ, что хочетс€. Ќапример random. »ли 42.

 ажетс€ то ли в PHP то ли в MySQL 3 такой код выдавал 0 как результат.

Ќу а чего, все же логично, скормили кривые числа - получили кривой результат, всЄ как надо.
26 мар 19, 14:12††††[21843774]     ќтветить | ÷итировать —ообщить модератору
 Re: си строки в delphi  [new]
Foxpc
Member

ќткуда:
—ообщений: 152
Arioch,

не, php выдаст INF точно говорю. + предупреждени€
26 мар 19, 14:20††††[21843787]     ќтветить | ÷итировать —ообщить модератору
“опик располагаетс€ на нескольких страницах: 1 2      [все]
¬се форумы / Delphi ќтветить