|
|
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Как корректно принять СИ строку (char *) в delphi ? В Си char* может в себе хранить полноценный юникод. PAnsiChar отпадает. PWideChar(string) даёт китаёсщину пока нашёл для себя такой вариант Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 22:08 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Foxpc, надо разбираться, почему PWideChar(string) "даёт китаёсщину", вероятно что кодировка у строки получается не та ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 22:12 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
FoxpcВ Си char* может в себе хранить полноценный юникод. Не может. Для юникода есть wchar_t или накрайняк WCHAR. Тем, кто запихивает UTF-16 в char* отрывают руки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 22:12 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Только для СиШников юникод в char* это норма. И все они, начиная от маленьких компаний до гигантов используют char* https://ru.wikipedia.org/wiki/Символьный_тип авторСимвольный тип (Сhar) — тип данных, предназначенный для хранения одного символа (управляющего или печатного) в определённой кодировке. Может являться как однобайтовым (для стандартной таблицы символов), так и многобайтовым (к примеру, для Юникода). Основным применением является обращение к отдельным знакам строки. Я понимаю это как, что они умеют его просто напросто выводить правильно, без преобразований в виде конвертации. А работает это так же как и для обычной строки ... Там массив байт идёт по порядку. К примеру 'Hello'#9787 что будет ровно 72, 101, 108, 108, 111, 1074, 152, 187 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 22:26 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2019, 22:28 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Через отладчик глянул, он просто создал новую строку с кодом 65001 через _NewAnsiString и перенёс туда строку через move ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 00:23 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Типа Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 00:33 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
FoxpcТолько для СиШников юникод в char* это норма. И все они, начиная от маленьких компаний до гигантов используют char*Не все. А только те, кому руки отрывают. По сути - это указатель на память, а в него, конечно, могли понаписать и юникодных строк, и структур DBF, и все что угодно. Если ты уж точно уверен, что там юникод utf16 - тогда надо кастить например так: WideString( PWideChar( pStr ) ). Это сработает, если строка точно нультерминальная. Иначе надо знать размер и формировать String самому (чз SetString например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 00:55 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
FoxpcЧерез отладчик глянул, он просто создал новую строку с кодом 65001 через _NewAnsiString и перенёс туда строку через moveЗначит, похоже, это таки PAnsiChar. И AnsiString( pStr ) должно помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 00:57 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
YuRockНе все. А только те, кому руки отрывают. Это может быть переданная страница из интернет ресурса, в кодировки UTF8 с содержанием юникода и иероглифов. Данные в конечном итоге попадают в обработчик Насчёт чередований (p)(Ansi\Wide)String он выводил либо в» или же китаёсщину ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 01:13 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Foxpcв кодировки UTF8 с содержанием юникода и иероглифов. "Эт ты круто задвинул." Жги есчо. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 01:59 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Ты думаешь я тут шутки шучу ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 02:11 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Foxpc, Перевод в char * в wstring делается так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Далее Код: plaintext 1. 2. 3. 4. 5. 6. На Delphi будет код такой: Код: pascal 1. 2. 3. в си char - в делфи ansichar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 09:19 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
ziv-2014, с самой кодировкой проблем нет, проблема отобразить данные правильно. Но как понимаю, это нереально сделать через 1 тип без копирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 11:16 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
FoxpcТы думаешь я тут шутки шучу ? Нет, я думаю, что ты очередной новичок, который первый раз встретился с удивительным миром кодировок символов и тупит как и остальные его 100500 предшественников. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 13:38 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Foxpc, если не знаешь, что такое UTF-8, почитай про эту кодировку, в ней разные символы кодируются разным количеством байтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 13:50 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
=_= В сях char* строки UTF8 - 4 СИМВОЛА Юникод. И 3 байта русские буквы Аналог в Delphi нашёл UTF8String но корректно Delphi не умеет его отображать от Сей По этому приходится выполнять Хак UTF8String(PAnsiChar(PUTF8String)) Именно по этому я и задал тут вопроc, как корректно принять строку, и возможно ли это без хака А вы тут перекодировку строк суёте, глагольствуете мол новичок и не знает что такое UTF8 Я точно знаю одно, Delphi без костылей не работает с UTF8 которые пришли от Сей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 14:16 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Foxpc, TEncoding.UTF8.GetString? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 14:17 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
asviridenkov, Хак UTF8String(PAnsiChar(PUTF8String)) работает. Я не хочу этот хак менять на другой хак. Тем более когда другой во много раз хуже по производительности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 14:28 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
asviridenkov, хотя если посудить. То это полный аналог Utf8ToUnicodeString я тут глянул. Те же самые функции вызывает... Так что смысла особого вообще нет в TEncoding ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 14:42 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
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.03.2019, 14:43 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
s62, А теперь пожалуйста объясни мне, не посещённому в Юникод, почему если я напишу Код: pascal 1. 2. 3. 4. 5. И в итоге, что бы получить желаемое, надо сделать хак - UTF8String(PAnsiChar(PUTF8String)) Ведь в итоге он просто создаст Ansi строку, и перепишет туда символы через move Аналогично SetAnsiString(@Result, PAnsiChar(self), length(PAnsiChar(self)), 65001); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 14:53 |
|
||
|
си строки в delphi
|
|||
|---|---|---|---|
|
#18+
Foxpc, Я не понял, что у тебя за функция ZStr, но вообще компилятор и RTL Дельфи делают со строками разные преобразования. В переменной типа строка, кроме данных, хранится дополнительная информация (по отрицательному смещению) - длина, количество ссылок, кодовая страница. У UTF-8 кодовая страница как раз 65001. И когда потом с этой строкой делаются какие-то операции, кодировка учитывается. VCL использует внутренее представление строк в UTF-16. И когда строка выводится куда-нибудь, то Дельфи неявно преобразует строку в UTF-16. Если у тебя кодовая страница указана UTF-8, то она строку правильно преобразует и выведет, а если указано что-то другое, то Дельфи будет думать, что там строка в другом формате и преобразует ее неправильно. И при начальном присвоении, тоже наверное могут быть какие-то такого рода эффекты. Мне кажется, что корректный и понятный способ - который sviridenkov написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2019, 15:30 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=78&tid=2039659]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
292ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 577ms |

| 0 / 0 |
