C#:无法从MYSQL数据库中将数据打印为unicode字符

时间:2017-08-06 07:06:28

标签: c# mysql unicode printing tamil

您好我开发了一个Windows应用程序,允许用户保存数据并以泰米尔语字体查看数据。我安装了'Bamini'字体(泰米尔语字体),并将文本框和datagridview设置为Bamini字体。我可以在泰米尔语中保存和检索数据。

问题是我输入的泰米尔数据被编码并保存在数据库中 例如:如果我在文本框中输入'இந்தியா'并保存,它将在mysql db中保存为“,e; j_ah”(我已将列字符集设置为utf8)。 因此,当我获取数据并尝试打印时,它会打印“,e; j_ah”而不是“இந்தியா”。

有谁能让我知道我在这里做错了什么?!

我用来插入字符串的代码:

textBox1值为'இந்தியா'(因为textbox字体设置为'Bamini'tamil字体)

     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

表格结构:

          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 ; 

5 个答案:

答案 0 :(得分:2)

  

有谁能让我知道我在这里做错了什么?!

您使用的是可视编码字体。

在此方案中,按键盘上的逗号键,然后键入常规字符U + 002C COMMA ,。文本字段设置为一种字体,其中逗号的形状使其看起来像泰米尔语字母I,但它仍然是一个逗号。

逗号将存储在数据库中,搜索工具会将其匹配为逗号;如果你将它从数据库中拉回来并以Bamini字体显示它,那么它看起来就像一个泰米尔语字母I,但是以任何标准字体显示它,就像你用来检查数据库的字体一样,它会看起来像像一个逗号。

视觉编码字体是我们用来处理没有标准编码的语言脚本的方式,但今天不应该使用它们 - 在bin中查看Bamini。

现代操作系统提供本机泰米尔语键盘和字体(例如,在Windows下,Nirmala UI)。使用这种方法,用户可以键入普通的文本字段(没有特殊的字体集)并获得一个真正的Unicode字符U + 0B87 Tamil Letter I ,它在数据库中应该看起来一样,并且表现得很好语义上恰当。

答案 1 :(得分:1)

经过一长串的试验,我终于找到了一种替代方案,可以在打印机中打印泰米尔字符。 注意:硬件技术支持告诉我许多热敏打印机不接受通过原始打印机助手类发送的泰米尔语字符。

所以我设计了一份crsytal报告并尝试打印,这立即取得了成功。 (我的打印机是3英寸热敏打印机)

答案 2 :(得分:1)

在连接字符串中输入类似的内容:

ID = my_user;密码= MY_PASSWORD;数据库= some_db123;字符集= UTF8;

Description更改为CHARACTER SET utf8(或utf8mb4)。

请参阅此内容以获取更多调试信息:http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored

答案 3 :(得分:0)

字符串的UTF-8编码出了问题。 ",E; j_ah"肯定不是你的字符串的UTF-8表示。我建议完全绕过DB的UTF-8功能,并为你的" Country"使用简单的BLOB类型。 column,存储可变长度的普通字节数组。然后使用.NET的UTF-8编解码器并自己编码/解码,将编码的字节数组存储在BLOB列中。

所以改变"国家"的声明。到:

`Country` BLOB NOT NULL,   

使用Encoding.UTF8.GetBytes()和Encoding.UTF8.GetString()对您的泰米尔语字符串进行编码/解码。

答案 4 :(得分:0)

基本上,Bamini不是unicode标准。它有自己的编码,所以每当你读到你需要解码它,这意味着你需要在内容上设置bamini字体。当您尝试打印系统时未设置为bamini字体。

所以解决方案应该是使用unicode字体而不是bamini或在打印时设置bamini字体。