purebasic.info

PureBasic forum
Текущее время: Пн окт 22, 2018 4:37 am

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




Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс июл 03, 2011 10:30 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Похоже что функции PokeS и PeekS при использовании флага #PB_UTF8 используют кодировку не совместимую со стандартным UTF-8. :shock:
Для примера, я перевел редактор пурика, в UTF-8 и вбил в него текст "Это текст в формате UTF-8", а затем, сохранил на диск.
Потом открыл получившейся файл в HEX-редакторе и скопировал в буфер обмена данные, а затем вставил их в ДатаСекцию.
Получилось следующее:
Код:
1
2
3
4
5
6
7
8
String.s= PeekS(?Text, -1, #PB_UTF8)
Debug String
DataSection
  Text:
 Data.a $EF, $BB, $BF, $D0, $AD, $D1, $82, $D0, $BE, $20, $D1, $82, $D0, $B5, $D0, $BA
  Data.a $D1, $81, $D1, $82, $20, $D0, $B2, $20, $D1, $84, $D0, $BE, $D1, $80, $D0, $BC
  Data.a $D0, $B0, $D1, $82, $D0, $B5, $20, $55, $54, $46, $2D, $38, 0,   0,    0,  0
EndDataSection

Если запустить этот код, то в отладочном окне будет хрень в место текста! :shock:

Но этот код работает нормально:
Код:
1
2
3
4
*mem = AllocateMemory(200)
PokeS(*mem, "Это текст в формате UTF-8", -1, #PB_UTF8)
ShowMemoryViewer(*mem, 100)
Debug PeekS(*mem, -1, #PB_UTF8)

Если его запустить, то можно увидеть что в памяти совсем не то что в ДатаСекции первого исходника!
Это явно не UTF-8, а что тогда?

PS.
Функции ReadString и WriteString при использовании флага #PB_UTF8, работают нормально, но ИМХО, использовать запись во временный файл для преобразования кодировки - очень кривой костыль!

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 03, 2011 12:59 pm 
Не в сети
доцент

Зарегистрирован: Пт июн 24, 2011 2:55 pm
Сообщений: 68
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
если включить 'create unicode executable' в свойствах компилятора, то показывает почти правильно :?:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 12:30 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 773
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Debug PeekS(@Title) ; почему в юникоде возвращает "0_0" в место этого "Title_0"?
анси все работает как надо. :|
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CompilerIf #PB_Compiler_Unicode 
Procedure CC_MenuHelper_FindMenu(*Title, *Item, *SubItem)
  Protected Title.s, Item.s, SubItem.s
  Protected Window = OpenWindow( #PB_Any, 411, 210, 336, 200, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget )
  Protected Ok = ButtonGadget(#PB_Any, 10, 10, 110, 30, "Ok")
 
  While IsWindow( Window )
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        If EventGadget() = Ok And
           EventType() = #PB_EventType_LeftClick
            Title = "Title_0"
            Item = "Item_0"
            SubItem = "SubItem_0_0"
           
            If *Title :PokeS( *Title, PeekS( @Title )) :EndIf
            If *Item :PokeS( *Item, PeekS( @Item ) ) :EndIf
            If *SubItem :PokeS( *SubItem, PeekS( @SubItem ) ) :EndIf
           
            ProcedureReturn #True
        EndIf
      Case #PB_Event_CloseWindow :CloseWindow( Window )
    EndSelect
  Wend
EndProcedure
 
  Define Title, Item, SubItem
  CC_MenuHelper_FindMenu( @Title, @Item, @SubItem )
 
  Debug PeekS(@Title) ;
  Debug PeekS(@Item)
  Debug PeekS(@SubItem)
 
CompilerElse
  MessageRequester("","on unicode mode")
CompilerEndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 1:20 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Нормально не работает, потому что в коде ошибка. Включи Purifier и сам увидишь.
Проанализируй код и попытайся понять в чем ошибся.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 1:45 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 257
Благодарил (а): 34 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
Пётр писал(а):
...Для примера, я перевел редактор пурика, в UTF-8 и вбил в него текст "Это текст в формате UTF-8", а затем, сохранил на диск....

Вы забываете про "BOM" https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2

Пётр писал(а):
Data.a $EF, $BB, $BF, $D0, $AD, $D1, $82, $D0, $BE, $20, $D1, $82, $D0, $B5, $D0, $BA
Data.a $D1, $81, $D1, $82, $20, $D0, $B2, $20, $D1, $84, $D0, $BE, $D1, $80, $D0, $BC
Data.a $D0, $B0, $D1, $82, $D0, $B5, $20, $55, $54, $46, $2D, $38, 0, 0, 0, 0

разумеется PeekS() его не понимает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 2:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Kuzmat писал(а):
Вы забываете про "BOM"
Речь вообще не об этом и не в этом проблема.
Запустите этот код
Код:
1
2
3
4
*mem = AllocateMemory(200)
PokeS(*mem, "Это текст в формате UTF-8", -1, #PB_UTF8)
ShowMemoryViewer(*mem, 100)
Debug PeekS(*mem, -1, #PB_UTF8)

с ASCII кодировкой и с выключенной поддержкой юникода.
Сравните данные в отладочном окне и данными в ДатаСекции в первом сообщении. Видите разницу?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 2:48 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 257
Благодарил (а): 34 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
Да, вынужден согласиться (верхний файл, на скрине, создан в Notepad++ в кодировке utf8)
Изображение

зы. только в случае (исходник-utf8)+unicode код строки корректный (стандартный utf8)
зызы. думаю стоит отписать Фреду (если еще не отписали)


Вложения:
UTF8.jpg [84.26 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 3:26 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Давно уже написал, но исправлять он не торопится. Он вообще хочет исключить подсистему ASCII.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 8:07 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 619
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Цитата
Пётр писал(а):
Похоже что функции PokeS и PeekS при использовании флага #PB_UTF8 используют кодировку не совместимую со стандартным UTF-8. :shock:
Для примера, я перевел редактор пурика, в UTF-8 и вбил в него текст "Это текст в формате UTF-8", а затем, сохранил на диск.
Потом открыл получившейся файл в HEX-редакторе и скопировал в буфер обмена данные, а затем вставил их в ДатаСекцию.
Получилось следующее:
Код:
1
2
3
4
5
6
7
8
String.s= PeekS(?Text, -1, #PB_UTF8)
Debug String
DataSection
  Text:
 Data.a $EF, $BB, $BF, $D0, $AD, $D1, $82, $D0, $BE, $20, $D1, $82, $D0, $B5, $D0, $BA
  Data.a $D1, $81, $D1, $82, $20, $D0, $B2, $20, $D1, $84, $D0, $BE, $D1, $80, $D0, $BC
  Data.a $D0, $B0, $D1, $82, $D0, $B5, $20, $55, $54, $46, $2D, $38, 0,   0,    0,  0
EndDataSection

Если запустить этот код, то в отладочном окне будет хрень в место текста! :shock:

Но этот код работает нормально:
Код:
1
2
3
4
*mem = AllocateMemory(200)
PokeS(*mem, "Это текст в формате UTF-8", -1, #PB_UTF8)
ShowMemoryViewer(*mem, 100)
Debug PeekS(*mem, -1, #PB_UTF8)

Если его запустить, то можно увидеть что в памяти совсем не то что в ДатаСекции первого исходника!
Это явно не UTF-8, а что тогда?

PS.
Функции ReadString и WriteString при использовании флага #PB_UTF8, работают нормально, но ИМХО, использовать запись во временный файл для преобразования кодировки - очень кривой костыль!

Не знай в пурике 5.30 в обоих форматах дебагере 1 исходник пишет Это текст в формате UTF-8
2 исходник в обоих форматах в памяти типа юникодных иероглифов а в дебагере в кодировке UTF8 возвращает текст в кодировке простой текст кракозябры.
Думаю что может это не функции PokeS PeekS виноваты а форматы просмотрщиков (в компиляторе по умолчанию исходник UTF8) :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 8:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Сергейчик, посмотри на скрины выше. viewtopic.php?p=80485#p80485

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс май 17, 2015 10:02 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 619
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Пётр писал(а):
Сергейчик, посмотри на скрины выше. viewtopic.php?p=80485#p80485

Верхний файл тоже самое только нет начальных 3 байт указательных что UTF-8
Так там вот а в просмотрощике памяти как раз неясность а у меня вовсе символы юникодные а не коды может галку какую поставить а для уверенности что в памяти нужные символы её можно побайтово просмотреть без просмотрщика! :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пн май 18, 2015 5:17 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Я для себя написал прогу "Поиск и Замена", перелопачивал русский справочник. При написании столкнулся с такой фигнёй
ReadStringFormat() при чтении файла возвращает
866 OEM-русская = 24 YES, Ascii
1200 UTF-16LE = 25 YES, Unicode
1201 UTF-16BE = 4 NO, UTF-16BE, немного подвешивает программу и ни чего не находит
1251 = 24 YES, Ascii
65001 UTF-8 = 2, YES, UTF-8
12000 UTF-32LE = 25 NO, Unicode, немного подвешивает программу и ни чего не находит
12001 UTF-32BE = 24 NO, Ascii, надолго подвешивает программу и ни чего не находит

так что с кодировками полная хрень


У меня давно создалось впечатление, что немцы дилетанты и пишут язык для себя, только то что они знают. ИМХО.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Чт май 05, 2016 6:50 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 773
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
Debug PeekS(@Title) ; почему в юникоде возвращает "0_0" в место этого "Title_0"?
анси все работает как надо. :|

Теперь заметил, если добавить еще одну переменную в начале видает "TitlItem_0" в место этого "Title_0" что за хирня :shock: :shock: :shock:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
CompilerIf #PB_Compiler_Unicode 
Procedure CC_MenuHelper_FindMenu(*Title, *Item, *SubItem)
  Protected Title.s, Item.s, SubItem.s
  Protected Window = OpenWindow( #PB_Any, 411, 210, 336, 200, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget )
  Protected Ok = ButtonGadget(#PB_Any, 10, 10, 110, 30, "Ok")
 
  While IsWindow( Window )
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        If EventGadget() = Ok And
           EventType() = #PB_EventType_LeftClick
            Title = "Title_0"
            Item = "Item_0"
            SubItem = "SubItem_0_0"
           
            If *Title :PokeS( *Title, PeekS( @Title ) ) :EndIf
            If *Item :PokeS( *Item, PeekS( @Item ) ) :EndIf
            If *SubItem :PokeS( *SubItem, PeekS( @SubItem ) ) :EndIf
           
            ProcedureReturn #True
        EndIf
      Case #PB_Event_CloseWindow :CloseWindow( Window )
    EndSelect
  Wend
EndProcedure
 
  Define s, Title, Item, SubItem
  CC_MenuHelper_FindMenu( @Title, @Item, @SubItem )
 
  Debug PeekS(@Title) ;
  Debug PeekS(@Item)
  Debug PeekS(@SubItem)
 
CompilerElse
  MessageRequester("","on unicode mode")
CompilerEndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Чт май 05, 2016 8:12 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11300
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Не надоело наступать на одни и те же грабли? viewtopic.php?p=80480#p80480
viewtopic.php?p=80481#p80481
В коде не выделяется память под строку. Включи Purifier.

Упростил твой код. Делаешь примерно следующее.
Код:
1
2
Title.s=""
PokeS(@Title, Space(1000000))


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 619
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Я память выделяю так зачем пробелами заполнять,потом ещё прочитаешь что не то? :roll:
Код:
1
2
3
4
 
Global STROKA.s=#Null$без этого вроде как неправильно
STROKA=LSet(STROKA,50,"");выделяет количество нулевых символов 2 байта(если компилем в юникоде)
 



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

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


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

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


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

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