2011-07-20 83 views
1

目的正確顯示:要在在ENOVIA V6的用戶ID多語言字符TCL UTF-8字符無法在UI

我使用UTF-8編碼的TCL腳本,它似乎是正確保存多語言字符在數據庫中(經過一些轉換)。但是,我真的從數據庫中看到保存的信息。

在通過Power Web進行相同的練習時,保存的數據會以某種方式轉換回適當的多語言字符並正確顯示。

我在使用tcl方法時錯過了什麼嗎?

粘貼一個示例以幫助更好地理解。

原名稱:山花袋-PAL 名稱保存在數據庫中:Kátai-Pál 在UI我看到名稱爲:山花袋-PAL

在Tcl中我使用下面的語法 集編碼[編碼convertto utf-8Kátai-Pál]; 現在的用戶名就變成了:Kátai-Pál 在UI我看到名稱爲「Kátai-Pál」

+0

很可能你的數據庫就是這個問題。您正在使用哪個數據庫Oracle,DB2? – TrojanName

+0

請注意,Tcl手冊只聲稱Tcl使用Unicode字符串在內部維護文本信息; UTF-8僅僅是一個實現細節。所以,當你想通過線路發送數據(或者將它寫入文件等)時,通常必須將要保存的文本轉換爲適當的外部表示,通常使用'[encoding convertto $ encname $ text]' 。相反,當你閱讀時,從某處說UTF-8,你必須使用'[encoding convertfrom ...]'將其轉換爲Tcl的內部表示。 – kostix

+0

大腦,我們使用Oracle 10g數據庫。我們已驗證Oracle,App服務器和協作服務器已啓用urf-8設置。 – Ballu

回答

1

關鍵是要思考方面的​​字符,不字節。他們是不同的東西。編碼是將字符表示爲字節序列的方式(在內部,Tcl確實非常複雜,但如果您不開發Tcl的實現本身,則不應該在意這一點;可以說它是Unicode)。因此,當你使用:

encoding convertto utf-8 "Kátai-Pál" 

你正在做的字符序列,並要求字節(每結果人物之一)的序列,在給定的編碼字符的編碼(UTF- 8)。

你需要做的是讓數據庫集成層瞭解數據庫正在使用什麼編碼,以便它可以轉換回爲你的字符(你只能使用字節進行通信;其他一切都只是一種簡化)。有兩種方式可能發生:信息被正確共享(通過元數據或定義的約定),或者雙方都會假設偶爾會發生錯誤。這聽起來像後者是發生了什麼,唉。

如果你不能處理任何其他方式,你可以把生產出來的數據庫層的字節轉換成字符:

encoding convertfrom $theEncoding $theBytes 

工作了$theEncoding應該是什麼一般非常棘手,但它聽起來像是你的utf-8。一旦你有字符,Tcl/Tk將能夠正確顯示它們;它知道如何正確地將它們轉移到平臺GUI的內部。 (並且在你實際編寫的腳本中,你最好用它們的\uXXXX轉義替換非ASCII字符,因爲平臺不會就什麼編碼適用於腳本達成一致。唉。)

+0

「字節序列(每個結果字符一個)」的語句不完全正確:這隻適用於7位ASCII;更復雜的字母會爲一個源代碼點產生多字節UTF-8序列。例如,西里爾字符每個字符使用2個字節。我毫不懷疑你知道這不比我更糟糕,只是想讓這句話更清楚。 – kostix