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

C# : Unable to print data as unicode characters from MYSQL database

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

问题是我输入的泰米尔语数据已编码并保存在数据库中 例如:如果我在文本框中输入“இந்தியா”并保存,它在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

Table 结构:

          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 ; 

字符串的 UTF-8 编码出现问题。 ",e;j_ah" 肯定不是字符串的 UTF-8 表示形式。我建议完全绕过数据库的 UTF-8 功能,并为您的 "Country" 列使用简单的 BLOB 类型,它存储可变长度的纯字节数组。然后自己使用.NET的UTF-8编解码器encode/decode,将编码后的字节数组存储在BLOB列中。

所以把"Country"的声明改成:

`Country` BLOB NOT NULL,   

使用 Encoding.UTF8.GetBytes() 和 Encoding.UTF8.GetString() 来 encode/decode 您的泰米尔语字符串。

Can anyone let me know what i am doing wrong here?!

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

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

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

视觉编码字体是我们用来处理没有标准编码的语言脚本的方式,但今天不应该使用它们——垃圾桶里的查克巴米尼。

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

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

所以我设计了一个crsytal报告并尝试打印,这是立竿见影的效果。 (我的打印机是3寸热敏打印机)

在连接字符串中加入类似这样的内容:

id=my_user;密码=my_password;数据库=some_db123;charset=utf8;

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

查看更多调试信息:

基本上,Bamini 不是 unicode 标准。它有自己的编码,因此无论何时阅读都需要对其进行解码,这意味着您需要在内容上设置 bamini 字体。当您尝试打印时,系统未设置为 bamini 字体。

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