蛋滴上的 TCL 编码问题



我已经在一个新的 Debian 服务器上安装了 Eggdrop,其中包含 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

我添加了一行,说转换为 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 :02Error02 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

这里有很多问题。一个是谷歌正在提供字符串,这些字符串应用了独立于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 :02Error02 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 目前只处理 Unicode 的基本多语言平面 – BMP,因此某些汉字可能存在问题。这是一个已知问题。

相关内容

  • 没有找到相关文章

最新更新