purebasic.info

PureBasic forum
Текущее время: Чт янв 18, 2018 12:32 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс июн 26, 2016 10:42 pm 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 27
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Сергейчик писал(а):
Ну будет буфер с нулями и что это как то повлияет на строку и программу в дальнейшем?

Зачем выделять буфер больше, чем требуется? Я действительно не понимаю. Вместо StringByteLength(string.s, #PB_Unicode) достаточно выделить StringByteLength(string.s, #PB_UTF8) или еще +1 при записи нуля в конце строки. И ни байта больше. А то давайте тогда уж мегабайт выделим под буфер, условившись, что строки больше мегабайта использоваться не будут. Пусть будет "буфер с нулями", памяти сейчас у всех много, мегабайт туда, мегабайт сюда - какая разница? Заодно сэкономим несколько строк исходного кода и несколько сот байтов программы на вычислении длины строки и размера буфера.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пн июн 27, 2016 2:20 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
puric писал(а):
Сергейчик писал(а):
Ну будет буфер с нулями и что это как то повлияет на строку и программу в дальнейшем?

Зачем выделять буфер больше, чем требуется? Я действительно не понимаю. Вместо StringByteLength(string.s, #PB_Unicode) достаточно выделить StringByteLength(string.s, #PB_UTF8) или еще +1 при записи нуля в конце строки. И ни байта больше. А то давайте тогда уж мегабайт выделим под буфер, условившись, что строки больше мегабайта использоваться не будут. Пусть будет "буфер с нулями", памяти сейчас у всех много, мегабайт туда, мегабайт сюда - какая разница? Заодно сэкономим несколько строк исходного кода и несколько сот байтов программы на вычислении длины строки и размера буфера.

Функция StringByteLength(string.s, #PB_UTF8) считает байты в строке с определённой кодировкой а не так что исходная строка ucs-2 и нужно посчитать сколько понадобится байт для utf8 :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пн июн 27, 2016 10:13 am 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 27
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Сергейчик писал(а):
Нет, ну можно конечно написать процедуру len чтобы считала сколько нужно выделить байт под utf8 из строки ucs-2.
или наоборот для ucs-2 из utf8.

При чем тут utf-8 vs. ucs-2 и vice versa? Кодировка, в которой эта строка хранится в сегменте данных, нас вообще не волнует; StringByteLength считает размер строки в байтах в целевой кодировке - именно тот объем, который строка займет в куче, вне зависимости от использованной кодировки исходного кода и от режима компиляции (Ascii/Unicode).

Вот вы тоже для чего-то предложили использовать buff_size.i = StringByteLength(string.s, #PB_Unicode). Почему #PB_Unicode, если мы используем UTF-8? Да, оно работает и так. В нашем конкретном примере. Но это потенциальный источник ошибок. Ну а память экономить нам как бы незачем, что такое эти 30 байтов, когда на дворе XXI век, а в кармане почти у каждого телефон с 2 Гб оперативной памяти. :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пн июн 27, 2016 4:39 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
puric писал(а):
Сергейчик писал(а):
Нет, ну можно конечно написать процедуру len чтобы считала сколько нужно выделить байт под utf8 из строки ucs-2.
или наоборот для ucs-2 из utf8.

При чем тут utf-8 vs. ucs-2 и vice versa? Кодировка, в которой эта строка хранится в сегменте данных, нас вообще не волнует; StringByteLength считает размер строки в байтах в целевой кодировке - именно тот объем, который строка займет в куче, вне зависимости от использованной кодировки исходного кода и от режима компиляции (Ascii/Unicode).

Вот вы тоже для чего-то предложили использовать buff_size.i = StringByteLength(string.s, #PB_Unicode). Почему #PB_Unicode, если мы используем UTF-8? Да, оно работает и так. В нашем конкретном примере. Но это потенциальный источник ошибок. Ну а память экономить нам как бы незачем, что такое эти 30 байтов, когда на дворе XXI век, а в кармане почти у каждого телефон с 2 Гб оперативной памяти. :D

То то и оно что исходная строка в ucs-2 и StringByteLength если и имеет различные флаги для кодировок то это отнюдь не говорит что подсчитывая байты в исходной строке ucs-2 ,(как сам выразился будь она где угодно) с другими флагами для кодировок подсчитает нужный результат. :D
Поэтому и написал что нужна спец функция типа смотрим ucs-2 а подсчёт байтов ведём не для неё а для другой предпологаемой кодировки,того же utf8 ,так понятно :?:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пн июн 27, 2016 7:39 pm 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 27
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
StringByteLength вычисляет байтовую длину строки в УКАЗАННОЙ кодировке. Что ее попросите показать, то она и покажет. В каком виде хранится исходная строка в коде программы - Ascii или Unicode - роли не играет. Также на результат не влияет и кодировка файла-исходника, будь то Ascii или UTF-8. Эта функция корректно отрабатывает во всех возможных режимах и нам не надо изобретать велосипед. В данном примере следует использовать ее с флагом #PB_UTF8. Во-первых, это гарантирует результат, во-вторых, улучшает читаемость и понятность программы: сразу видно, что нас интересует длина строки именно в этой кодировке и именно ее мы собираемся использовать при записи в память функцией PokeS. А то давайте тогда использовать "магические числа": buff_size = 2 * Len(string) - и потом будем ломать голову, почему выделили удвоенную длину строки, а не утроенную или учетверенную. Читаемость исходного кода от таких фокусов резко падает, хоть программа и сохраняет работоспособность.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пн июн 27, 2016 11:12 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
puric писал(а):
StringByteLength вычисляет байтовую длину строки в УКАЗАННОЙ кодировке. Что ее попросите показать, то она и покажет. В каком виде хранится исходная строка в коде программы - Ascii или Unicode - роли не играет. Также на результат не влияет и кодировка файла-исходника, будь то Ascii или UTF-8. Эта функция корректно отрабатывает во всех возможных режимах и нам не надо изобретать велосипед. В данном примере следует использовать ее с флагом #PB_UTF8. Во-первых, это гарантирует результат, во-вторых, улучшает читаемость и понятность программы: сразу видно, что нас интересует длина строки именно в этой кодировке и именно ее мы собираемся использовать при записи в память функцией PokeS. А то давайте тогда использовать "магические числа": buff_size = 2 * Len(string) - и потом будем ломать голову, почему выделили удвоенную длину строки, а не утроенную или учетверенную. Читаемость исходного кода от таких фокусов резко падает, хоть программа и сохраняет работоспособность.

Не обнадеживайся по поводу исходной строки и файла кодировки...
Вот код где строка ucs-2 и вроде бы да StringByteLength правильно считает что если переводить из 2-х байт ucs-2 в utf8 будет уже по 3 байта,а вот если строка ascii с 12 байтами то зачем в utf8 18 байт?
Код:
1
2
3
4
5
6
7
8
9
10
 
Global string_ucs.s = Chr($263A)+Chr($263A)+Chr($263A)+Chr($263A)+Chr($263A)+Chr($263A);Строка ucs-2 12 bait 6 символов
Global string_ascii.s=Chr($263A)+Chr($263A)+Chr($263A)+Chr($263A)+Chr($263A)+Chr($263A)
PokeS(@string_ascii,string_ucs,12,#PB_Ascii);ASCII 12 символов
 
Debug string_ucs
Debug string_ascii
Debug StringByteLength(string_ucs, #PB_UTF8)
Debug StringByteLength(string_ascii, #PB_UTF8)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вт июн 28, 2016 10:24 am 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 27
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Сергейчик, вы прикалываетесь? Какая же она Ascii, когда вы в нее напихали иероглифов из исходной Unicode (вы ведь идете в ногу со временем, не так ли?)? Более того, записали терминирующий строку нуль (один!), который в режиме компиляции Unicode за конец строки не считается и чудесным образом склеивается с остатком исходной Unicode-строки (исходная строка была 12 байт, функцией PokeS вы записали 6 байт строки и один нолик, а еще 5 байт никуда не делись). Стоит перед PokeS затереть нулями буфер, как StringByteLength(string_ascii, #PB_UTF8) "чудесным образом" показывает правильное значение - 9 (три раза по $4F4F в кодировке Unicode - это три символа по три байта в режиме UTF-8).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вт июн 28, 2016 11:24 am 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 27
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Да, а зато ваша строка символов $263A отлично демонстрирует пагубность предложения уч. MrF вычислять размер буфера с флагом #PB_Unicode вместо #PB_UTF-8. Буфер под нее нужен длиной 18 байт, выделяется всего 12, но записываются (реально записываются в память!) все 18. Русская рулетка в действии - никогда заранее не угадаешь, что будет затерто.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB