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



>我已经在一个新的 Debian 服务器上安装了 Eggdrop,但它在处理特殊字符时一直遇到问题。

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

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îçõé.

(另请参阅之前提出的问题,但未解决:Eggdrop 上的 TCL 编码问题)

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

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

Tcl和Google彼此之间可以正确通信(我已经仔细检查了代码),因此我们可以消除这种可能性。因此,问题出在您的 IRC 客户端、IRC 服务器和蛋滴之间;如果他们不同意"在线"字节的解释是什么,你就会被破坏。

您可以通过使用 encoding convertto(和 encoding convertfrom)在脚本中添加(或删除)重整,但有必要清楚您正在做什么才能使其正确。在内存中,Tcl 将字符串表示为抽象 Unicode 字符序列;将它们"写下来"在内存中的方式不是你的事(事实上,它们会不时以一种复杂的方式变化,在运行时方面几乎总是非常高效)。如果人们普遍认为 IRC 服务器的通道将通过 UTF-8,那么您的要求是:

  • 确保蛋滴脚本将 UTF8 编码的字符写入通道。
  • 确保您的客户端从通道读取 UTF8 编码的字符。
处理

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

putserv "PRIVMSG $chan :$translated"

如果没有,请执行此操作:

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

实验。使用正确的。

在第二点(客户端)上,探索其设置并正确处理。请注意,如果客户端在无法正确显示所有 Unicode 字符的情况下运行,则可能会出现其他问题(如果在终端中运行时,这是一个常见问题)。您的蛋滴脚本无法解决此问题。

值得注意的是,如果数据的创建者以"编码a"对其进行编码,并以"编码b"读取,那么在您查看文本时,文本已经损坏。你不能只是告诉 Tcl 用另一种编码编码它并期望它工作。

可以这样考虑:

  • 发件人 RAR 的文件
  • 接收器获取文件并使用zip公式对其进行解码(并获取垃圾)
  • 您告诉代码将文件重新编码为 LZ7
  • 您现在有 LZ7 编码垃圾

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

相关内容

  • 没有找到相关文章

最新更新