![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringOf
Gu © (2011-12-03 19:42:00)StringOf = массив байт в строку. А как строку в массив байт?
B:TBytes;s:string;
..
s:=TBytes(b);
компилит норм но показывет только 1 символ
абизяна (2011-12-04 14:50:00) [1]
> Юрий_ (04.12.11 10:48) [28]
>
> var B: Byte;
>
> Какое значение надо присвоить переменной B, чтобы стало
> истинным выражение:
>
> Ord(B) = '?';
>
> Я не Мастер, я правда не понимаю. Объясните
Вобще-то вопросительные знаки подставляет сама Windows, если в строке присутствуют значения, которых нет в использующейся кодовой таблице.
sniknik (2011-12-04 13:30:00) [2]> Мне вопрос был понятен с самого начала.
малацца
> В вопросе фактически обозначена версия Delphi.
да ну? я вот пишу на D7, и с чего мне знать, что StringOf это не функция самописка, а "фактически обозначает версию и Unicod"?
p.s. "претензии" у меня к тебе не потому что ты чего то не знаешь, а потому что начал с "наездов".
p.p.s. не у всех все также как у тебя... в смысле у спрашивающих тоже, и именно поэтому нужно приводить информацию, а не надеяться на "умолчания".
DVM (2011-12-04 11:45:00) [3]
> sniknik © (04.12.11 11:04) [29]
> а почему ты начал отвечать после "раскрытия" смысла вопроса,
> а не "до" когда любой вопрос на доп.инфу авторами воспринимается
> как личное оскорбление.
> и почему потом начал не с объяснений автору того, что его
> "понимание" не совсем правильно, а с придирок отвечающим?
> которые кстати подготовили для тебя это самое "раскрытие".
>
Мне вопрос был понятен с самого начала. Я не мониторю все вопросы в реальном времени, чтоб отвечать немедленно и первым.
> StringOf = массив байт в строку. А как строку в массив байт?
Чего тут можно не понимать то? Тут не написано про Ansi строки, это все догадки. Наоборот тут обозначены Unicode строки. В вопросе фактически обозначена версия Delphi.
sniknik (2011-12-04 11:07:00) [4]> Какое значение надо присвоить переменной B, чтобы стало истинным выражение:
> Ord(B) = '?';
посмотри сам
Ord(B) = Ord('?');
только с учетом версии дельфи, может быть и другая функция типа AnsiOrd.
sniknik (2011-12-04 11:04:00) [5]> Да не, просто надо ещё и TEncoding передавать, тогда проблем не должно быть.
UTF8 это транспортная кодировка, и универсальная с учетом страницы, это как раз аналог юникода... т.е. того во что тут конвертируется. если бы он работал в нем, то проблем бы и так не было. но он то ее пытается "вернуть" ее обратно, в состояние массива байт.
т.е. проблемы будут. обязательно будут, если раскодировать из любой юникодной/аналога в других условиях, с другой локалью, с отсутствующими в ней символами.
не придумывайте вопросу других смыслов в общем...
весь вопрос в том что нужна "обратная" функция, не понимание заметьте, он говорит, что понимает. и "понимая" не видит равенства масиву байт строке, если без конвертаций, а в представлении, не говорит о таком существенном различии сразу, а только после доп вопроса и уже "обидевшись", он типа понимает, это мы тут "тупые", не можем сразу понять чего ему надобно.
DVM © (04.12.11 00:01) [22]
> Не хотел я цепляться, но ты сам заставляешь. Вот ты пишешь:
вот тоже, типа не хотел, но придется...
а почему ты начал отвечать после "раскрытия" смысла вопроса, а не "до" когда любой вопрос на доп.инфу авторами воспринимается как личное оскорбление.
и почему потом начал не с объяснений автору того, что его "понимание" не совсем правильно, а с придирок отвечающим? которые кстати подготовили для тебя это самое "раскрытие".
Юрий_ (2011-12-04 10:48:00) [6]
> игра в "дурочку"? возьми ord() от него, да посмотри. или
> в дебаге... средств хватает.
var B: Byte;
Какое значение надо присвоить переменной B, чтобы стало истинным выражение:
Ord(B) = '?';
Я не Мастер, я правда не понимаю. Объясните
Ega23 (2011-12-04 02:41:00) [7]
> Не, ну если все происходит на одном компьютере и в течение
> работы программы не меняется локаль то все будет туда сюда
> конвертироваться однозначно.
ключевое слово "если", согласись...
> Но для передачи данных TBytes по сети такой метод не походит
> разумеется.
> Точнее подходит но кодировку надо брать UTF8 а не Default
Да не, просто надо ещё и TEncoding передавать, тогда проблем не должно быть.
DVM (2011-12-04 01:25:00) [8]
> Ega23 © (04.12.11 01:14) [24]
> Поэтому однозначного решения [6] нет, т.к. мы не можем однозначно
> утверждать, какой default system locale был выбран изначально.
>
Не, ну если все происходит на одном компьютере и в течение работы программы не меняется локаль то все будет туда сюда конвертироваться однозначно. Default кодировка она всегда однобайтная для Windows:
class function TEncoding.GetDefault: TEncoding;
begin
{$IFDEF MSWINDOWS}
Result := ANSI;
end;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
Result := UTF8;
end;
{$ENDIF POSIX}
Но для передачи данных TBytes по сети такой метод не походит разумеется.
Точнее подходит но кодировку надо брать UTF8 а не Default
Германн (2011-12-04 01:23:00) [9]Ну и ещё.
TBytes - это не массив байт. Это "тип" Дельфи.
Это я к тому, что если не умеешь задать правильно вопрос, то не чирикай!
Ega23 (2011-12-04 01:14:00) [10]
> но с поправкой на то, что массив байт можно трактовать неоднозначно,
> может этот массив это анси строка, а может UTF8 или Unicode.
>
Вот именно.
Производная от f(x) = 2x + 5 будет равна 2 для любого x
Но количество первообразных от F(x) = 2 будет бесконечно. Одна из них - таки да, будет f(x) = 2x + 5
Поэтому однозначногорешения [6] нет, т.к. мы не можем однозначно утверждать, какой default system locale был выбран изначально.
Германн (2011-12-04 00:14:00) [11]
> Gu (03.12.11 20:31) [6]
>
> если не знаете ответа нечего писать.
> для особо непонятливых:
>
Если не умеете задавать вопросы, то нечего писать.
Надо было сразу сказать для чего вам нужны были преобразования String->TBytes и TBytes->String. Ибо такие преобразования в Д2009+ весьма неоднозначные.
DVM (2011-12-04 00:01:00) [12]
> sniknik © (03.12.11 23:38) [20]
Не хотел я цепляться, но ты сам заставляешь. Вот ты пишешь:
> как раз после того как стало понятно, что автор говорит
> про юникод "знак равенства" был скинут. ну и т.д.
Т.е в посте [5], допустим, ты считаешь, что автор вопроса работает с Ansi строкой. В посте [5] было сказано:
> чего??? еще раз по ручки, начни с описания чего делает,
> как ты понимаешь, StringOf... и что есть для нее "обратная"?
> только не функцией, а описанием действия.
Далее ты добавил:
> > // Converts a byte array into a Unicode string using the
> default system locale.
> "обратная" в общем случае невозможна. получишь набор из
> вопросов.
>
> чего не понятно?
Но как раз для Ansi строки лежащей в массиве TBytes конвертация ее в UnicodeString с помощью StringOf не приведет к потере данных и обратная конвертация также всегда возможна.
DVM (2011-12-03 23:50:00) [13]
> sniknik © (03.12.11 23:38) [20]
> как раз после того как стало понятно, что автор говорит
> про юникод
Это ж было понятно с самого начала. В D2006-2007 насколько мне известно типа TBytes нет. Появился он в D2009. Строка у него string - значит Unicode. Функции StringOf тоже нет в < D2009.
> правда не понял, что Ega23 имел в виду? правда, правда?
> или это типа "раскрытие" вопроса для автора? ну так и объяснял
> бы ему... а то выглядит как тупой "наезд", и "гнутье пальцев".
>
Я правда не понял. Я ясность пытаюсь внести в вопрос.
sniknik (2011-12-03 23:38:00) [14]> то нельзя все же так ставить знак равенства между строкой и массивом байт.
как раз после того как стало понятно, что автор говорит про юникод "знак равенства" был скинут. ну и т.д.
и тут же пошли какие-то претензии к ответившим... какие то инсенуации в виде доп вопросов... игра в "дурочку"... странно все это.
вот скажи ты когда переспрашивал
DVM © (03.12.11 21:59) [11]
> Строку в массив байт невозможно?
правда не понял, что Ega23 имел в виду? правда, правда? или это типа "раскрытие" вопроса для автора? ну так и объяснял бы ему... а то выглядит как тупой "наезд", и "гнутье пальцев".
DVM (2011-12-03 23:27:00) [15]Короче, правильный ответ на [0] - это 2 функции:
TEncoding.тут нужная кодировка.GetString
TEncoding.тут нужная кодировка.GetBytes
DVM (2011-12-03 23:24:00) [16]
> не строку в массив, и зачем это, если одно и то же
Если речь об юникодных строках, то нельзя все же так ставить знак равенства между строкой и массивом байт. Во-первых, все же, в строке первый элемент имеет индекс 1, а в массиве 0, во вторых S[I] - это не байт с индексом I, а элемент массива Char с таким индексом. Length для массива байт вернет длину в байтах, для строки в символах, для анси строки в байтах, для UTF8 строки я вообще затрудняюсь ответить что она вернет (по идее в байтах, но их количество не равно количеству символов). Ну есть и другие отличия. Ну это вы и без меня знаете.
> Юникод-строку в анси-строку.
я наверное тупой, но насколько я понял ему нужны были 2 функции, одна строку в массив TBytes (именно в него, а никакой другой массив) и вторая из TBytes обратно в строку. И то и другое вполне себе возможно, но с поправкой на то, что массив байт можно трактовать неоднозначно, может этот массив это анси строка, а может UTF8 или Unicode. Но если мы знаем, что четко всегда используем Unicode то перевести можно и туда и обратно без проблем. То же можно сказать про любую другую кодировку.
Найденная им функция
function StringOf(const Bytes: TBytes): UnicodeString;
begin
if Assigned(Bytes) then
Result := TEncoding.Default.GetString(Bytes, Low(Bytes), High(Bytes) + 1)
else
Result := '';
end;
как видно использует дефолтную кодировку Multibyte что приведет к потере возможно символов, если изначально в TBytes находились Unicode символы.
sniknik (2011-12-03 23:18:00) [17]> очень интересно,
врешь. не интересно. просто решил "пальцы погнуть"
> как вы собираетесь получить набор из вопросов в массиве байтов?
не собираюсь вообще... само получится. предупреждаю.
> Какой байт есть "вопрос"?
игра в "дурочку"? возьми ord() от него, да посмотри. или в дебаге... средств хватает.
Юрий_ (2011-12-03 23:08:00) [18]
> "обратная" в общем случае невозможна. получишь набор из
> вопросов.
>
очень интересно, как вы собираетесь получить набор из вопросов в массиве байтов? Какой байт есть "вопрос"?
Ega23 (2011-12-03 23:01:00) [19]
> Строку в массив байт невозможно?
Юникод-строку в анси-строку.
sniknik (2011-12-03 23:00:00) [20]> Строку в массив байт невозможно?
не строку в массив, и зачем это, если одно и то же, а "обратное", Converts из юникода в исходный массив.