在tcl中将UTF-8转换为ANSI

时间:2017-10-15 08:19:34

标签: tcl

proc pub:write { nick host handle channel arg } {
set fid [open /var/www/test.txt w]
puts $fid "█████████████████████████████████████████████████████████████████"
puts $fid "██"
close $fid
}

当我打开i Webbrowser的结果时:

 █████████████████████████████████████████████████████████████████

但它应该:

█████████████████████████████████████████████████████████████████

1 个答案:

答案 0 :(得分:1)

欢迎来到字符串编码的复杂性。你必须得到两个的东西才能做出你正在尝试做的工作。 在进行更改之前阅读以下所有内容 ,因为它们都可怕地进行交互。

  1. 需要使用正确的编码将字符写入文件。这是通过在通道上配置编码来完成的,默认情况下系统特定的值通常是但不总是正确。

    我采用非常狂野的猜测,像“cp437 DOSLatinUS”这样的编码是正确的。

    fconfigure $fid -encoding cp437
    

    但是,Tcl通常很擅长选择正确的做法。

    此外,还有大量不同的编码。有些是非常相似的,挑选哪一个使用的是一点黑色艺术。通常最好的选择是在可能的情况下坚持utf8,否则使用正确的编码(由协议或系统定义)并采取大量的谨慎。 这真的很复杂!

  2. 首先要将角色正确地输入Tcl。这意味着必须在源文件中对字符进行编码,并且Tcl必须使用正确的编码来读取该文件。由于该文件是由另一个程序(通常是您的编辑)编写的,因此存在各种各样的麻烦。如果您可以发现那里使用的编码(通常是完全猜测的话),那么您可以使用-encoding选项tclshsource来让Tcl知道发生了什么上。

    或者,在源代码中坚持使用ASCII子集,因为它可以非常可靠地处理相同的正在使用的编码。您可以通过将每个转换为Tcl转义序列\u2588来完成此操作。至少在这种情况下,您可以确定 搜索输出编码问题。

  3. 在调试这个东西时,一次只能改变一件事然后再重新测试,因为那里有很多可能出错的位并以下面产生奇怪结果的方式毒害正在发生的事情。我建议首先尝试转义序列,因为这至少意味着你知道输入数据是正确的;一旦你知道你没有把垃圾扔进去,你可以尝试找出你是否真的遇到垃圾问题以及该怎么办。

    最后,请注意,混合网络会使问题困难十倍......