TCL的常规字符串引用

我正在编写一个实用程序(恰好在python中),它以TCL脚本的形式生成输出。给定python中的一些任意字符串变量(不是unicode),我想生成一个类似的TCL行
set s something
...将TCL变量'
s
'设置为该精确字符串,无论其中包含什么奇怪的字符。没有变得太奇怪,我不想让输出比需要的更麻烦。我相信一个体面的方法 如果字符串不是空的并且只包含字母数字,而某些字符如
.-_
(但绝对不是
$"{}
)那么它可以按原样使用; 如果它只包含可打印字符而没有双引号或花括号(并且不以反斜杠结尾),那么只需将
{}
放在它周围; 否则,在使用
逃逸后使用
""
"
{
}
$
[
]
,并且
nnn
因非打印字符而逃脱。 问题:是否需要在双引号内转义的完整字符集?我在文档中找不到这个。我是否错过了一些东西(我几乎错过了(2)的字符串不能以结尾)。 我知道有很多其他字符串可以用ѭ4引用,但似乎很难轻易识别它们。此外,看起来非打印字符(特别是换行符)可以使用(2)如果您不介意它们确实存在于TCL输出中。     
已邀请:
你真的只需要2个规则, 逃避花括号 用大括号包裹输出 您不必担心换行符,不可打印的字符等。它们在文字字符串中有效,并且TCL具有出色的Unicode支持。
set s { 
this is
a 
long 
string. I have $10 [10,000 cents] only curly braces { need } to be escaped.
t is not  a real tab, but '    ' is. "quoting somthing" :
{matchin` curly braces are okay, list = string in tcl}
}
编辑 根据您的评论,您可以执行以下操作: 逃脱
[]
{}
$
将整个输出包装在
set s [subst { $output } ]
中 Tcl的美妙之处在于它具有非常简单的语法。除了上述3之外,没有其他角色需要转义。 编辑2最后一次尝试。 如果你通过
subst
一些选项,你只需要逃脱
{}
set s [subst -nocommands -novariables { $output } ]
你需要提出一个正则表达式来将不可打印的字符转换为它们的转义代码。 祝好运!     
一旦你进入双引号字符串,Tcl的元字符很少,并且可以通过在它们前面放一个反斜杠来引用它们。你必须引用的字符是
本身,
$
[
,但是引用
]
{
}
被认为是好的做法,因此脚本本身是可嵌入的。 (Tcl自己的
list
命令执行此操作,除了它实际上没有包装双引号所以它也处理反斜杠,它也会尝试在“漂亮”字符串上使用其他技术。有一个算法可以做到这一点,但我建议不要困扰你代码中的那么多复杂性;简单的通用规则对于正确的编码要好得多。) 第二步是将数据导入Tcl。如果要生成文件,最好的选择是将其写为UTF-8并使用
-encoding
选项tclsh / wish或使用
source
命令明确说明编码是什么。 (如果您在同一个进程中,请将UTF-8数据写入字符串并对其进行评估。作业完成。)该选项(在Tcl 8.5中引入)专门用于处理此类问题:
source -encoding "utf-8" theScriptYouWrote.tcl
如果那是不可能的,那么你将不得不退回添加额外的报价。最好的事情是假设您只提供ASCII支持(一个很好的最低公分母)并引用其他所有内容作为第一段中描述的引用的单独步骤。要引用,将每个Unicode字符从U + 00080转换为形式为
uXXXX
的转义序列,其中XXXX正好是四个十六进制数字[1],另外两个是文字字符。不要使用
xXX
表格,因为它有一些“令人惊讶”的错误(唉)。 [1] Tcl中存在一个关于处理Basic Multilingual Pane之外的字符的漏洞,其中一部分是
u
形式无法应对。幸运的是,非BMP角色在实践中仍然相当罕见。     
要做得对,你还应该指定你的python字符串所在的编码,通常是sys.getdefaultencoding()。否则,在将其翻译为Tcl时,您可能会编码。 如果您的字符串中包含二进制数据并且因此需要Tcl二进制字符串,那么它将始终有效:
data = "".join("\u00%02x" % ord(c) for c in mystring)
tcltxt = "set x %s" % data
虽然看起来像十六进制转储,但是,它是一个十六进制转储... 如果您使用任何特殊编码,如UTF-8,您可以通过使用编码convertfrom / convertto和相应的Python惯用语来增强它。
data = "".join("\u00%02x" % ord(c) for c in myutf8string)
tcltext = "set x [encoding convertfrom utf-8 %s]" % data
你当然可以稍微改进一下,避免所有非特殊字符的 u编码,但上述情况在任何情况下都是安全的。     

要回复问题请先登录注册