Проблемы с кодировкой TCL на Eggdrop - PullRequest
1 голос
/ 15 мая 2011

Я установил Eggdrop на новый сервер Debian с TCL8.5 и последней версией eggdrop.К сожалению, есть проблемы с моим сценарием и обработкой специальных символов, таких как é, J'aime и т. Д.

Пример может быть лучше показать вам:

13:41 <@me> test
13:41 <@me> !tr nl This is a test
13:41 < bot> Dit is een test
13:41 <@me> !tr fr I am a stranger
13:41 < bot> Je suis un étranger
13:41 <@me> !tr fr I love you
13:42 < bot> Je t&#39;aime

Я добавилстрока, которая говорит, что convert-to utf-8 и eggdrop также работают на utf-8, и это, казалось, делало étranger читабельным в моем клиенте irc, однако большинство символов (китайский, арабский) совсем не были близки.Код TCL выглядит следующим образом:

namespace eval gTranslator {

bind pub - !tr gTranslator::translate

proc translate { nick uhost handle chan text } {
  package require http
  package require json
  set lngto [string tolower [lindex [split $text] 0]]
  set text [::http::formatQuery q [join [lrange [split $text] 1 end]]]
  set dturl "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=$text"
  set res [::json::json2dict [::http::data [::http::geturl $dturl]]]
  set lng [dict get $res responseData language]
  if { $lng == $lngto } {
  putserv "PRIVMSG $chan :\002Error\002 translating $lng to $lngto."
  return 0
  }
  set trurl "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=$lng%7c$lngto&$text"
  putlog $trurl
  set res [::json::json2dict [::http::data [::http::geturl $trurl]]]
  putlog $res
  #putserv "PRIVMSG $chan :Language detected: $lng"
  set translated [dict get $res responseData translatedText]
  putserv "PRIVMSG $chan :[encoding convertto utf-8 $translated]"
}
}

Подключение через telnet дает следующую дополнительную информацию:

*** Me joined the party line.
[13:49:34] http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=en%7cfr&q=I%20like%20cookies
[13:49:34] responseData {translatedText {J&#39;aime les cookies}} responseDetails null responseStatus 200
[13:50:11] http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=en%7cfr&q=I%20am%20a%20stranger
[13:50:11] responseData {translatedText {Je suis un étranger}} responseDetails null responseStatus 200

1 Ответ

2 голосов
/ 16 мая 2011

Здесь происходит ряд проблем. Один из них заключается в том, что Google возвращает строки с примененной кодировкой сущностей независимо от кодировки JSON . Вам придется расшифровать это. Во-вторых, у вас есть утечка памяти (токены, возвращаемые http::geturl, необходимо очистить вручную), которую лучше всего устранить, написав вспомогательную процедуру:

namespace eval gTranslator {

# Factor this out into a helper
proc getJson url {
  set tok [http::geturl $url]
  set res [json::json2dict [http::data $tok]]
  http::cleanup $tok
  return $res
}
# How to decode _decimal_ entities; WARNING: high magic factor within!
proc decodeEntities str {
  set str [string map {\[ {\[} \] {\]} \$ {\$} \\ \\\\} $str]
  subst [regsub -all {&#(\d+);} $str {[format %c \1]}]
}

bind pub - !tr gTranslator::translate
proc translate { nick uhost handle chan text } {
  package require http
  package require json
  set lngto [string tolower [lindex [split $text] 0]]
  set text [http::formatQuery q [join [lrange [split $text] 1 end]]]
  set dturl "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=$text"

  set lng [dict get [getJson $dturl] responseData language]

  if { $lng == $lngto } {
    putserv "PRIVMSG $chan :\002Error\002 translating $lng to $lngto."
    return 0
  }
  set trurl "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=$lng%7c$lngto&$text"
  putlog $trurl

  set res [getJson $trurl]

  putlog $res
  #putserv "PRIVMSG $chan :Language detected: $lng"

  set translated [decodeEntities [dict get $res responseData translatedText]]

  putserv "PRIVMSG $chan :[encoding convertto utf-8 $translated]"
}
}

(У вас уже есть encoding convertto utf-8, применяемый для решения проблемы недостаточного понимания кодирования в яйце).

Я проверил результаты запроса на арабский ответ, и, похоже, вернул UTF-8. Таким образом, любые проблемы, которые у вас возникают с этим, находятся в вашем клиенте. (Может быть проблема с некоторыми китайскими символами из-за того факта, что Tcl в настоящее время обрабатывает только базовую многоязычную плоскость - BMP - Unicode. Это известная проблема.)

...