Eggdrop 上的 TCL 编码问题 [英] Issues with TCL encoding on Eggdrop

查看:24
本文介绍了Eggdrop 上的 TCL 编码问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在新的 Debian 服务器上安装了 Eggdrop,它带有 TCL8.5 和最新版本的 eggdrop.不幸的是,我的脚本和特殊字符(如 é、J'aime 等)的处理存在问题.

I have installed Eggdrop on a new Debian server with TCL8.5 and the latest version of eggdrop. Unfortunately there are issues with my script and the handling of special characters as é, J'aime, etc.

最好举个例子:

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代码如下:

I have added the line that says convert-to utf-8 and eggdrop is running at utf-8 too and it seemed to make étranger readable in my irc client, however most characters (Chinese, Arabic) weren't close at all. The TCL code is as follows:

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 连接提供了以下附加信息:

Connecting via telnet gave the following additional information:

*** 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

推荐答案

这里有很多问题.一是 Google 正在返回应用实体编码的字符串,独立于 JSON 编码.你必须解码它.其次,您有内存泄漏(http::geturl 返回的令牌需要手动清理),最好通过编写帮助程序来解决:

There are a number of issues going on here. One is that Google is delivering strings back that have entity encoding applied independent of JSON encoding. You'll have to decode that. Second, you've got a memory leak (tokens returned by http::geturl need to be manually cleaned up) which it's best to address by writing a helper procedure:

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 对编码缺乏正确理解的问题.)

(You already have the encoding convertto utf-8 applied to work around eggdrop's lack of proper understanding of encodings.)

我检查了查询阿拉伯语响应的结果,返回的 UTF-8 似乎是正确的.因此,您遇到的任何问题都在您的客户端中.(某些中文字符可能存在问题,因为 Tcl 目前仅处理 Unicode 的基本多语言平面 - BMP.这是一个已知问题.)

I've checked the results of querying for an Arabic response, and it appears to be correct UTF-8 returned. As such, any problems you're having with it are in your client. (There may be an issue with some Chinese characters due to the fact that Tcl currently only handles the Basic Multilingual Plane – BMP – of Unicode. This is a known issue.)

这篇关于Eggdrop 上的 TCL 编码问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆