1
set botlisten(port) "3333"
set botlisten(password) "123456"
set botlisten(channel) "#chan"
listen $botlisten(port) script botlisten
proc botlisten {idx} {
    control $idx botlisten2
}
proc botlisten2 {idx args} {
global botlisten newTorrentChannel
set args [join $args]
set botlisten(pass) [lindex [split $args] 0]
set botlisten(message) [join [lrange [split $args] 1 end]]
if {[string match $botlisten(pass) $botlisten(password)]} then {
   putquick "PRIVMSG $botlisten(channel) :$botlisten(message)"
 } else {
  putlog "Unauthorized person tried to connect to the bot"
  }
}  

メッセージに次の文字があるとします: ąčęėįšųūž そのため、ボットは奇妙な文字を出力します。したがって、私の意見では、解決策は utf-8 サポートを追加することです。

4

1 に答える 1

6

Tcl は 10 年以上にわたって完全に統合された UTF-8 サポートを提供してきました (Tcl 8.1 以来、単調に優れたバージョンが存在するため、誰もそのバージョンを使用しなくなりました)。

ただし、一般に、外界との特定の通信チャネルで使用されるエンコーディングについて Tcl に通知する必要があります (fconfigure-encodingオプションを使用)。Tcl は、システムに依存するデフォルトの推測を使用します。私のシステムでは実際には UTF-8 ですが、他のシステムでは ISO 8859-1 または -15 または適切な Windows コードページです。(ところで、Tclはデフォルトの推測を行うのが得意です。)ソケットでは、エンコーディングは実際にはプロトコルレベルの決定であるため、より扱いにくいです(一部のプロトコルは特定のエンコーディングを指定します-SMTPはそうします、IIRC-プロトコルの操作中にエンコーディングを切り替えるものもあります) – HTTP はその代表的な例です – まったく指定しない人もいます – IRC はその典型的な例です)。場合によっては、encodingコマンドは、スクリプトがバイト シーケンスと文字間の変換を手動で制御できるようにするために必要です。かなり珍しいですけどね。

もちろん、コードが単に Tcl の文字列を取得し、低レベルのネットワーク (hellooo、eggdrop!) を使用してネットワーク全体に盲目的にプッシュするだけである場合、一般的な Tcl レベルでできることはそれほど多くありません。その場合の回避策は、eggdrop をビルドして別のエンコーディングを使用するか ( Zero のコメントからのリンクにあるように)、次のように変更を行うために使用encodingすることです。

UTF-8 をエンコードされた形式に変換します。

set encoded [encoding convertto utf-8 $normalString]

エンコードされた UTF-8 を通常の文字列に変換します。

set normalString [encoding convertfrom utf-8 $encoded]
于 2011-04-15T09:34:55.743 に答える