TCL脚本(Eggdrop)有特殊字符的问题

时间:2011-05-19 20:20:45

标签: tcl eggdrop

我已在新的Debian服务器上安装了Eggdrop,但它在处理特殊字符方面一直存在问题。

Eggdrop正在运行utf-8。我甚至在脚本中手动强制执行tf编码为utf-8。我尝试使用http://eggwiki.org/Utf-8的说明重新编译Eggdrop。

22:00 <@me> !tr fr I have prepared lots of cookies for the entire family.
22:00 <@bot> J'ai préparé beaucoup de biscuits pour toute la famille.
22:00 <@me> !tr ar The special characters are processed.
22:00 <@bot> êêÃE ÃEùçÃDìé çÃDãíñÃA çÃDîçõé.

(另见前一个问题,未解决:Issues with TCL encoding on Eggdrop

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]"
}
}

2 个答案:

答案 0 :(得分:2)

你看到的那个丑陋的混乱是UTF-8解释为ISO 8859-1。它表明在某处错误解释了字符的含义,并且可能是由 通过通信通道划线,通过应用额外的一轮编码引起的。因为涉及很多移动部件(IRC客户端,IRC服务器,eggdrop,你的脚本,谷歌翻译),所以有必要通过调试来讨论。

Tcl和Google彼此正确沟通(我已仔细检查过代码),因此我们可以消除这种可能性。因此问题出在您的IRC客户端,IRC服务器和eggdrop之间;如果他们不同意“电线”字节的解释是什么,那么你就会受到损害。

您可以使用encoding convertto(和encoding convertfrom)在脚本中添加(或删除)修改,但必要 clear

  • 确保eggdrop脚本将UTF8编码的字符写入频道。
  • 确保您的客户端从频道中读取UTF8编码的字符。

处理第一点,我不记得eggdrop是否自动处理编码。如果是这样,您只需在绑定的最后阶段执行此操作:

putserv "PRIVMSG $chan :$translated"

如果没有,请执行以下操作:

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

试验。使用正确的。

在第二点(客户端)上,探索其设置并使其正确。请注意,如果客户端在无法正确显示所有Unicode字符的情况下运行(如果在终端中运行则是常见问题),则可能存在其他问题。你的eggdrop脚本可以做什么 nothing 来解决这个问题。

答案 1 :(得分:0)

值得注意的是,如果数据的创建者将其编码为“编码a”并且在“编码b”中读取,那么在您查看文本时,文本已经被破坏。你不能告诉Tcl用另一种编码对它进行编码,并期望它能够正常工作。

考虑如下:

  • sender rar是一个文件
  • 接收器获取文件并使用zip公式对其进行解码(并获得垃圾回收)
  • 您告诉代码将文件重新编码为lz7
  • 你现在有lz7编码垃圾

由于原始解码与编码不匹配,因此您遇到了问题。这不是一个完美的类比,但它可能有所帮助。