create or replace function na_source__new (
...
insert into na_sources (
...
) values (
v_source_id,
p_package_id,
p_owner_id,
p_feed_url,
p_link,
convert(p_title using utf8_to_iso_8859_1),
convert(p_description using utf8_to_iso_8859_1),
p_updates,
p_last_scanned,
p_last_modified
);
Isso até que funcionou. Mas depois de um tempo, quando o News Aggregator faz um update, o título a descrição são novamente escritas no banco usando LATIN 1. Eu não faço idéia de onde devo mudar para solucioar esse problema. Alguém sabe?
Obrigado, Vitor
Autor: Vitor Reis

1919 comentários
E, como eu suspeitava, o problema está na definição do feed que vc pegou, ou melhor na (in)definição. Vá até o feed original e peça para exibir o código fonte. Vc vai ver que o cabeçalho do feed é omisso quanto a codificação do arquivo. Ele declara apenas <?xml version="1.0"?>
enquanto deveria declarar <?xml version="1.0" encoding="ISO-8859-1"? > Então o feed-parser está tratando o feed que o news-aggregator recebe como o padrão que é UTF-8. Dê uma olhada na procedure feed_parser::parse_feed no API-DOC. O código está bem esclarecedor e tem até o seguinte comentário # Unless we have explicit encoding information, we'll assume UTF-8 Agora, o ideal mesmo seria pedir pro povo a Agência Brasil arrumar o feed que eles estão disponibilizando :-)
if { [regexp {^[[:space:]]*<\?xml[^>]+encoding="([^"]*)"} $xml match encoding] } {
set encoding [string tolower $encoding]
set tcl_encoding [ns_encodingforcharset $encoding]
if { $tcl_encoding ne "" } {
set xml [encoding convertfrom $tcl_encoding $xml]
}
} else {
set encoding [string tolower 'ISO-8859-1']
set tcl_encoding [ns_encodingforcharset $encoding]
set xml [encoding convertfrom $tcl_encoding $xml]
} mas não consegui nada :/ Sei que devo estar
errando o tcl, só não consigo ver onde. Obrigado pela ajuda!
na_parse, e parece que tudo é feito por lá. Coloquei o ns_log lá e toda vez que algum feed é adicionado ou atualizado ele retorna algo. Agora preciso descobrir como reencodar tudo :/ Basicamente ele só tem um tratamento de erro e um return $result Tentei a mesma coisa que tinha postado aqui antes, mas não deu... set encoding [string tolower ISO-8859-1]
set tcl_encoding [ns_encodingforcharset $encoding]
ns_log Notice "Feed parsing in NA with encoding $encoding"
ns_log Notice "Feed parsing $result"
return [encoding convertfrom $tcl_encoding $result]
O log me aparece tudo ok, me volta o encoding usado, dá a mensagem de encoding carregado, me volta o $result , mas pelo que parece não converte. Alguma ajuda? :/ Obrigado gente!
set encoding [string tolower $encoding]
set tcl_encoding [ns_encodingforcharset $encoding]
if { $tcl_encoding ne "" } {
set xml [encoding convertfrom $tcl_encoding $xml]
}
} Depois não esqueca de recarregar o arquivo indo até seuhost/acs-admin/apm e clicando em Watch all files, para o pacote news-aggregator.
set tcl_encoding [ns_encodingforcharset $encoding]
set xml [encoding convertfrom $tcl_encoding $xml]
Agora minha dúvida é, existe alguma função no tcl que eu consigo descobrir em que encoding está uma determinada string? abs, vitor