带(CR)(LF)的文本长度

时间:2017-04-29 15:14:14

标签: tcl

我从sqlite3值得到了可以用十六进制写的“0x0D 0x0A”。是的,它是(CR)和(LF)。我想知道我得到的数据长度。但命令“字符串长度”返回1,而不是2.“字符串字节长度”也返回1。如何以字节为单位获得正确的数据长度?

这是一个简单的例子。在实际程序中,我从sqlite获得了不同编码的不同文本数据。我只需要以字节为单位获取数据长度。但是文本中的每个(CR)(LF)都计为1个字节。 从sqlite和file获取数据的示例:

sqlite dbcmd messages.db
set t [dbcmd message from messages limit 1,1]
string length $t


set f [open test.txt r]
set t [read $f]
string length $t

(Windows 7,ActiveTcl 8.6.4,tclkit 8.6.6)

1 个答案:

答案 0 :(得分:1)

默认情况下, Tcl将正在读取的文件中的CR-LF序列转换为简单的LF字符。这通常很有用,因为它极大地简化了脚本中的普通文本处理。但是,如果想要确切的值,则可以使用fconfigure将通道置于备用处理模式。例如,将频道的-translation设置更改为lf(来自auto)将会保留所有回车(以及换行)。

set f [open test.txt r]
fconfigure $f -translation lf
set t [read $f]
string length $t

其他一些设置通常会影响您的效果,尤其是-eofchar-encoding选项。 -eofchar通常是EOF(即与 Ctrl + Z 相关联的字符),-encoding是依赖于系统的特定值比如您的平台是什么以及您的区域设置是什么。如果你想真正使用二进制数据,即只得到字节,你可以将-translation选项设置为binary,这样就可以正确处理二进制数据。 open命令中有一个常用选项的简写:

set f [open test.txt rb];  # ««« “b” flag in open mode
set t [read $f]
string length $t

如果你确实得到了字节,并希望在某些时候从中获取字符,那么encoding convertfrom命令就是你需要的工具。请记住,字符和字节不是相同的东西。必须放弃这一点,以便允许人们使用比字节中可表达的值更多的字符。< / p>