2017-08-06 57 views
3

嗨我已經開發了一個Windows應用程序,它允許用戶保存數據並以泰米爾字體查看數據。我安裝了'Bamini'字體(泰米爾語字體),並將文本框和datagridview設置爲Bamini字體。我能夠在泰米爾保存和檢索數據。C#:無法打印數據爲來自MYSQL數據庫的Unicode字符

問題是我輸入的泰米爾數據被編碼並保存在數據庫 例如:如果我在文本框中輸入'இந்தியா'並保存,它被保存爲mysql,db中的「,e; j_ah」列字符集設置爲utf8)。 由於這個,當我得到數據並嘗試打印它時,它正在打印「,e; j_ah」而不是'இந்தியா'。

任何人都可以讓我知道我在這裏做錯了嗎?!我使用插入串

代碼:

textBox1的值是 'இந்தியா'(因爲文本字體被設置爲 'Bamini' 泰米爾字體)

 string insertdata = "INSERT INTO tamil (country) VALUES (@cnt)"; 
    MySqlCommand cmd = new MySqlCommand(insertdata,connection); 
    connection.Open(); 
    cmd.Parameters.AddWithValue("@cnt",textBox1.Text); 
    cmd.ExecuteNonQuery(); 
    connection.Close(); 

數據庫受到影響如下:

 tablename: Tamil 
     Sno Country 
     1  ,e;j_ah 

表海虹之彩cture:

  CREATE TABLE `tamil` (        
      `sno` int(11) auto_increment NOT NULL,       
      `Description` varchar(50) NOT NULL,       
      `Country` varchar(50) character set utf8 NOT NULL,       
      KEY `id_sno` (`sno)        
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 
+0

您是否調試過並檢查了您從文本框中檢索的字符串是否具有正確的數據?我建議記錄字符串中每個字符的UTF-16值 - 例如,'foreach(char c in text){Console.WriteLine(((ushort)c).ToString(「x4」)); }' –

+0

接下來,請向我們展示您用於將數據保存到數據庫的代碼。 –

+0

在使用Unicode字符之前,您可能必須使用UTF-8解碼數據庫列中的字節流。 – SBS

回答

1

經過一段長時間的試驗後,我終於找到了一種在我的打印機上打印泰米爾字符的替代解決方案。 注意:硬件技術支持部門告知我,許多熱敏打印機不接受通過原始打印機助手類發送的泰米爾字符。

所以我設計了一個crsytal報告,並嘗試打印,這是立竿見影的成功。 (我的打印機是3英寸熱敏打印機)

0

字符串的UTF-8編碼出錯了。 「,e; j_ah」肯定不是字符串的UTF-8表示。我建議完全繞過數據庫的UTF-8功能,併爲您的「國家/地區」列使用簡單的BLOB類型,該列存儲可變長度的普通字節數組。然後使用.NET的UTF-8編解碼器自己編碼/解碼,將編碼的字節數組存儲在BLOB列中。

因此 「國家」 的聲明更改爲:

`Country` BLOB NOT NULL, 

使用Encoding.UTF8.GetBytes()和Encoding.UTF8.GetString()來編碼/解碼的泰米爾字符串。

+0

我試過了。但不工作。 – Aesha

+0

您是否在調用AddWithValue()時將Encoding.UTF8.GetBytes(textBox1.Text)替換爲textBox1.Text?如果是,並且它不起作用,請嘗試參數集合中更多類型特定的「添加」方法。例如帶參數名稱和SqlDbType的Add()方法。 – SBS

+0

是的,我做到了。將嘗試另一種選擇 – Aesha

2

任何人都可以讓我知道我在這裏做錯了嗎?!

您正在使用視覺編碼的字體。

在此方案中,您按下鍵盤上的逗號鍵,然後鍵入常規字符U + 002C COMMA ,。文本字段設置爲逗號形狀使其看起來像泰米爾字母I的字體,但它仍然是一個逗號。

逗號將被存儲在數據庫中,搜索工具將以逗號匹配它;如果你將它從數據庫中拉出來並顯示在Bamini字體中,那麼它看起來就像是一個泰米爾字母I,但是它以任何標準字體顯示,就像你用來檢查數據庫的字體一樣,它會看起來像像一個逗號。

視覺編碼的字體是我們用來處理沒有標準編碼的語言腳本的方式,但它們不應該在今天使用 - 將Bamini夾在垃圾箱中。

現代操作系統提供原生泰米爾語鍵盤和字體(例如在Windows下,Nirmala UI)。使用這種方法,用戶將輸入一個普通的文本字段(沒有特殊的字體集),並得到一個真正的Unicode字符U + 0B87泰米爾語字母I ,它應該看起來在數據庫中是一樣的,並且在語義上適當。

0

基本上Bamini不是Unicode標準。它有它自己的編碼,所以每當你閱讀你需要解碼它,這意味着你需要在內容上設置bamini字體。當您嘗試打印系統時未設置爲bamini字體。

所以解決方案應該使用unicode字體而不是bamini,或者在打印時設置bamini字體。