For those having source files containing data not encoded in the system encoding (and thus being not recognized correct by source), this small helper proc may help you: --- proc encsource {source_file encoding} { if {![catch {open $source_file r} fid]} { if {![catch {fconfigure $fid -encoding $encoding}} msg]} { set script [read $fid] catch {close $fid} } else { # make sure channel gets closed catch {close $fid} return -code error "unknown encoding \"$encoding\"" } } else { # return error message similar to source cmd return -code error "couldn't read file \"$source_file\": no such file or directory" } # not sure if this has to be catched as well to propagate the error code to the caller # to imitate the original source cmds behaviour. uplevel 1 $script } --- Usage: % encsource "test.tcl" utf-8 ---