首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eggdrop上的TCL编码问题

Eggdrop上的TCL编码问题
EN

Stack Overflow用户
提问于 2011-05-15 20:07:21
回答 1查看 1.5K关注 0票数 1

我已经在一个新的Debian服务器上安装了eggdrop,安装了TCL8.5和最新版本的Eggdrop。不幸的是,我的脚本和特殊字符的处理都有问题。

下面的示例可能是最好的示例:

代码语言:javascript
复制
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代码如下:

代码语言:javascript
复制
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连接时提供了以下附加信息:

代码语言:javascript
复制
*** 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-16 15:20:49

这里有许多问题。其一是Google正在返回独立于JSON编码应用实体编码的字符串。你得把它解码。其次,你有一个内存泄漏(由http::geturl返回的令牌需要手动清理),最好的解决方法是编写一个助手过程:

代码语言:javascript
复制
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来解决eggdrop对编码缺乏正确理解的问题。)

我检查了查询阿拉伯语响应的结果,似乎返回了正确的UTF-8。因此,您在使用它时遇到的任何问题都在您的客户端。(由于Tcl目前只处理Unicode的基本多语种平面- BMP -,所以一些中文字符可能会有问题。这是一个已知问题。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6008280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档