#

好像滿多人都有遇到了「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]

留下您的意見

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates