purebasic.info

PureBasic forum
Текущее время: Сб янв 20, 2018 6:07 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Парсер XML и Unicode
СообщениеДобавлено: Сб апр 26, 2014 11:49 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июл 14, 2013 10:04 pm
Сообщений: 30
Откуда: Новосибирск
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.
Пункты репутации: 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
38
39
40
41
Global NewList GroupsList()
 
Procedure FillGroupsList(*CurrentNode, CurrentSublevel)
  ; http://purebasic.info/phpBB3ex/viewtopic.php?f=1&t=3603&p=72459&hilit=xml#p72459
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal
    If GetXMLNodeName(*CurrentNode)="group"
      AddElement(GroupsList())
      ;Debug "group"
    EndIf
 
    *ChildNode = ChildXMLNode(*CurrentNode)
   
    While *ChildNode <> 0
      FillGroupsList(*ChildNode, CurrentSublevel + 1)    
      *ChildNode = NextXMLNode(*ChildNode)
    Wend      
  EndIf
EndProcedure
 
Procedure LoadGroupsList(xml.s)
  If xml<>""
    CatchXML(0,@xml,Len(xml),0,#PB_UTF8)
    *MainNode = MainXMLNode(0)    
    If *MainNode
      FillGroupsList(*MainNode, 0)
    EndIf
    FreeXML(0)
  EndIf
EndProcedure
 
If ReadFile(0, "XML groups test 30 list.txt")
  While Eof(0) = 0
    text.s=text.s+ReadString(0, #PB_UTF8)
  Wend
  CloseFile(0)
Else
  MessageRequester("Information","Couldn't open the file!")
EndIf
 
LoadGroupsList(text.s)
Debug ListSize(GroupsList())



Парсю я им файл с описанием 30 вконтактовских групп, и, соответственно, дебагер должен вернуть число 30, однако:
Вложение:
Комментарий к файлу: С вкл. Unicode
15.png [274.53 KiB]
Скачиваний: 0


Отключаю юникод - дебагер возращает 30...

Прикольно, но я до сих пор понять не могу КАК ТАКОЕ получается :(

Может косяк в коде?

_________________
Ms Windows 7 SP1 (x64) | Linux Kubuntu 14.04 (x86) | PureBasic 5.30 (x86)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Парсер XML и Unicode
СообщениеДобавлено: Вс апр 27, 2014 9:55 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
EM140 писал(а):
Может косяк в коде?
Да. Вот тут.
Код:
1
CatchXML(0,@xml,Len(xml),0,#PB_UTF8)


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Парсер XML и Unicode
СообщениеДобавлено: Вс апр 27, 2014 3:26 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июл 14, 2013 10:04 pm
Сообщений: 30
Откуда: Новосибирск
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
EM140 писал(а):
Может косяк в коде?
Да. Вот тут.
Код:
1
CatchXML(0,@xml,Len(xml),0,#PB_UTF8)



Всмысле кодировка неправильная? Менял на #PB_Unicode - аналогичный результат :(

_________________
Ms Windows 7 SP1 (x64) | Linux Kubuntu 14.04 (x86) | PureBasic 5.30 (x86)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Парсер XML и Unicode
СообщениеДобавлено: Вс апр 27, 2014 3:34 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
EM140 писал(а):
Всмысле кодировка неправильная?
Нет. Всмысле использование Len(). Она возвращает число символов. А для UTF-8 и юникода это не равно числу байт. Вот и обрезает половину текста, т. к. его размер указан неправильно.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Парсер XML и Unicode
СообщениеДобавлено: Вс апр 27, 2014 3:44 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
EM140 писал(а):
Всмысле кодировка неправильная?
Len()- возвращает количество символов, а тебе нужно передать количество байт, это StringByteLength()+1, +1 это ноль(кнец строки)

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Парсер XML и Unicode
СообщениеДобавлено: Вс апр 27, 2014 3:45 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июл 14, 2013 10:04 pm
Сообщений: 30
Откуда: Новосибирск
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
EM140 писал(а):
Всмысле кодировка неправильная?
Нет. Всмысле использование Len(). Она возвращает число символов. А для UTF-8 и юникода это не равно числу байт. Вот и обрезает половину текста, т. к. его размер указан неправильно.


Так точно! Должно быть CatchXML(0,@xml$,StringByteLength(xml$),#PB_Ignore, #PB_Unicode)!

Большое спасибо за наводку! ^_^

_________________
Ms Windows 7 SP1 (x64) | Linux Kubuntu 14.04 (x86) | PureBasic 5.30 (x86)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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


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

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


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

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