好像滿多人都有遇到了「Tk視窗中文亂碼」的問題,如果你也有這個問題的話,這篇文章應該可以幫上一點小忙。
亂碼的原因
會造成亂碼最大的原因是因為「直譯器」及「程式檔案」採用了不同的編碼方式。 舉例來說:如果你的直譯器是跑在big5的模式下,那你的程式檔案也一定要採用big5的編碼方式,不然的話就會產生亂碼。一般我們可以用下面的步驟來解決中文亂碼的問題:
1. 查看直譯器支援的編碼
因為Tcl/Tk的直譯器有太多版本了,所以我們要先確定你安裝的直譯器有包含utf-8及big5兩種編碼,請用下面的程式來檢查:set txt [text .t] $txt insert end [encoding names] pack $txt -expand 1 -fill both
這個程式會把直譯器支援的所有編碼都列在文字方塊裡。一般來說utf-8的支援應該會包含在裡面,所以不太需要擔心。我們需要擔心的是big5的支援。請查看文字方塊裡面有沒有cp950或big5,如果沒有的話就表示不支援big5的編碼,也就是說你的程式檔案不能使用big5的方式編寫,只能改採用utf-8來編寫。請注意下圖中紅色框起來的地方:
圖 q1-1
圖中顯示在我的環境下用big5及utf-8都沒問題。
2. 檢查程式檔案的編碼
當你確定了直譯器支援的編碼後,下一步是要確定你的程式檔案是採用什麼編碼,正常情況下你應該會自己知道才對...因為程式是你寫的。如果你真的忘記的話...可以用瀏覽器打開程式,然後調整「字元編碼」的功能,看哪一種編碼會讓程式顯示正常,那就是程式檔的編碼了。3. 指定直譯器的編碼選項
確定了程式的檔案編碼後,最後一步就是要執行程式了。請在執行程式時為直譯器加上編碼選項,語法像這樣:wish.exe -encoding 程式檔案的編碼 程式檔案
或是
tclsh.exe -encoding 程式檔案的編碼 程式檔案
例如,你的程式(main.tcl)是用big5編寫的,那你要這樣啟動:
wish.exe -encoding big5 main.tcl
如果是用utf-8編寫的,那你要這樣子啟動:
wish.exe -encoding utf-8 main.tcl
好了只要依照上面的步驟處理,應該就不會有中文亂碼的問題了。
按右上方的「#」號切換側邊欄
17 個意見
Jet.Huang | 2009年6月5日 下午2:04
照著步驟做就可以正常顯示中文了,謝謝大大.
Dai | 2009年6月5日 下午3:38
請不用客氣!! 恭喜你成功了。
Anonymous | 2009年7月29日 下午5:16
build_Menubar $main_name mbar \
{"帮助" \
{"ABOUT SAVI..." "details(build)"} \
{} \
{"介绍 SaVi..." "helpfile(build) README"} \
{"SaVi 中 的 缺 陷..." "helpfile(build) BUGS"} \
{"SaVi 中 的 Texturemapping..." "helpfile(build) README-COVERAGE-TEXTUREMAP"} \
{} \
{"关于 SaVi..." "about(build)"} } \
{"文件"} \
{"编辑" \
{"仿 真 常 数..." "params(build)"} \
{} \
{"现 有 卫 星..." "edit(build)" } \
{"新 建 卫 星..." "main(new)" } \
{} \
{"取 消 选 择" "main(unselect_all)" } \
{"复制" "main(copy)" } \
{"清 除" "main(delete)" } } \
{"视图"} \
{"星座"} \
{"演示"}
当我运行这段代码的时候,上面除了“文件”,“编辑”,“视图”,“星座”,“演示”能正常显示汉字以外其它汉字显示的都是乱码,请问一下怎么改进才不显示乱码!万分感谢
Dai | 2009年7月31日 下午3:28
我可能要你提供下面的資訊才可以幫你判斷,可能是哪邊出錯了.
1.你tcl/tk的版本是? 作業系統是?
2.你運行這個script的環境是 utf-8 ?
3.你的script是用utf-8編碼?
330953647 | 2009年7月31日 下午5:31
您好,感谢您在百忙中抽出时间给我回复,我是一个tcl/tk初学者,有很多地方不懂,望您多多指教,我现在在用一款卫星仿真软件--savi,它是通过cygwin在windows下下运行的,运行后的控件是用tcl/tk语言写的,我在把它汉化的时候以为只需要把C:\cygwin\home\Administrator\savi\tcl文件下main.tcl中的控件英语字符串改为汉字就可以了,发现改了以后大部分汉字显示的都是乱码,就像我7月29日问您的那样,我用的是ActiveState ActiveTcl 8.5.7.0,操作环境是通过cygwin在windows下运行的,字体脚本是“GB2312”,字体是“宋体”,大小是“10”,我是用的“写字板”打开的源代码,直接在上面吧英文字符串改为汉语字符串的。
期待您的回复,万分感谢
Dai | 2009年7月31日 晚上9:32
看你的樣子,我猜測有可能是你在cygwin下執行tclsh的時候,其實啟動的是你由cygwin下安裝的tcl而不是active tcl,請你依照下面的步驟試看看:
1.在cygwin的命令模式下啟動tclsh,然後執行下面的命令
puts $::tcl_version
先確定是不是8.5.7。
2. 在cygwin的命令模式下啟動tclsh,然後執行下面的命令,看輸出是不是會有gb2312
puts [encoding name]
2.如果有的話請你用下面的命令啟動tcl程式
wish.exe -encoding bg2312 xxx.tcl
TerryWang | 2009年10月9日 下午5:10
請問D大...我使用ezdit來編譯TCL/TK...
但無法在寫code的地方輸入中文..只要輸入完要跑程式就會出現亂碼...您有一篇解決亂碼的...我看不太懂
wish.exe -encoding utf-8 main.tcl
這是在wish.exe主程式後面 + -encoding
嗎?? 該如何做可否說明更詳細...
不好意思...新手問些基本問題..感恩了
Dai | 2009年10月9日 下午5:46
你可以這樣試試 :
1.在ezdit視窗的最右下角有一個 "字元編碼" 的選項,確定這個設定值是 "utf-8"
2.然後在執行時指定字元編碼
wish.exe -encoding utf-8 main.tcl
sam | 2009年10月26日 下午2:37
大大,請問一下,您知道如何將tcl embed到visual c++6.0中嗎,我在網路上搜尋了很久都找不太到相關的文章,謝謝你。
Dai | 2009年10月26日 晚上7:51
請參考這一份文件,在後半段有關於TclApp的資料,也就是用C建立Tcl直譯器的方法。
Unknown | 2010年7月8日 中午12:08
請問在搜尋資料庫,欄位中有遇到全形符號ex:"、" or ","...也會出現亂碼,不然就是被半形的問號取代了,請問有什麼解決方法嗎? 謝謝您
dai | 2010年7月8日 下午3:36
請試試下面的例子,我執行起來是正常的
package require tdbc::sqlite3
tdbc::sqlite3::connection create db test.db
db allrows {
create table t(id int,name text);
INSERT INTO t VALUES(:id,:name);
} [dict create id "01" name "全**-.-**"]
puts "半:**-.-**"
puts [db allrows -as lists {
SELECT * FROM t WHERE name LIKE :name;
} [dict create name "%-%"]]
執行結果:
半:**-.-**
{1 全**-.-**}
Unknown | 2010年7月8日 下午4:55
我的執行結果
????.??? 中文.全形的符號都變成?
請問wish.exe -encoding utf-8 text.tcl 這是要去哪裡執行呢?
謝謝您
sam | 2010年7月8日 下午5:41
Hi...
若你是使用ezdit的話:
wish.exe -encoding utf-8 text.tcl 這一句是輸入在 工具/執行命令/執行 的欄位中,
而text.tcl又可被{%F}取代,{%F}代表目前檔案的路徑。
另外wish.exe -encoding utf-8 text.tcl這一句你也可以在Windows中按:
開始/執行/cmd 中,找到相對應的路徑,去執行text.tcl這個檔案。
亂碼的問題,請問你用的資料庫是sqlite嗎,不知道會不會是資料庫的關係?
Unknown | 2010年7月8日 下午5:58
我用的資料庫是ORACLE,在資料庫撈出來的資料是正常的,
但是用TCL把資料用網頁呈現都變問號(?)了
sam | 2010年7月8日 下午6:11
Hi...
網頁的原始碼部份
meta http-equiv="content-type" content="text/html; charset=UTF-8
有確保和其它一致嗎,例如DB、TCL、HTML都是設為UTF-8字碼?
dai | 2010年7月8日 晚上7:59
sam說的非常的對
我再提供一個可能的問題點
請你先確定資料庫存存資料的編碼
如果不是utf-8,可以用下面的方法轉為utf-8,(假設資料是big5,data是資料庫撈出來的資料)
set utf8data [encoding convertfrom big5 $data]
若你是用cgi的話,還需要用下面的方法查看cgi執行時的編碼
puts [encoding system]
確定是utf-8的編碼,比較不會有問題
如果都是utf-8還是出現問題的話,就強迫再轉utf-8一次試試
set utf8data [encoding convertfrom utf-8 $data]
留下您的意見