C#:无法将MYSQL数据库中的数据打印为unicode字符
您好,我已经开发了一个windows应用程序,允许用户保存数据和查看泰米尔字体的数据。我安装了“Bamini”字体(泰米尔字体),并将textboxs和datagridview设置为Bamini字体。我能够用泰米尔语保存和检索数据 问题是我输入的泰米尔语数据被编码并保存在数据库中 例如:如果我输入'இந்தியா' 在textbox和save中,它在mysql数据库中保存为“e;j_ah”(我已将列字符集设置为utf8)。 因此,当我获取数据并尝试打印时,它会打印“e;j_ah”,而不是இந்தியா'. 谁能告诉我我做错了什么 我用来插入字符串的代码:C#:无法将MYSQL数据库中的数据打印为unicode字符,c#,mysql,unicode,printing,tamil,C#,Mysql,Unicode,Printing,Tamil,您好,我已经开发了一个windows应用程序,允许用户保存数据和查看泰米尔字体的数据。我安装了“Bamini”字体(泰米尔字体),并将textboxs和datagridview设置为Bamini字体。我能够用泰米尔语保存和检索数据 问题是我输入的泰米尔语数据被编码并保存在数据库中 例如:如果我输入'இந்தியா' 在textbox和save中,它在mysql数据库中保存为“e;j_ah”(我已将列字符集设置为utf8)。 因此,当我获取数据并尝试打印时,它会打印“e;j_ah”,而不是இந்த
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 ;
textBox1值为'இந்தியா' (因为文本框字体设置为“Bamini”泰米尔字体)
受影响的数据库如下:
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 ;
表格结构:
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 ;
字符串的UTF-8编码出错。“,e;j_ah”当然不是字符串的UTF-8表示形式。我建议完全绕过DB的UTF-8特性,为“Country”列使用一个简单的BLOB类型,它存储一个可变长度的普通字节数组。然后使用.NET的UTF-8编解码器,自己编码/解码,将编码的字节数组存储在BLOB列中 因此,将“国家”的声明更改为: 使用Encoding.UTF8.GetBytes()和Encoding.UTF8.GetString()对泰米尔字符串进行编码/解码 谁能告诉我我做错了什么 您使用的是视觉编码字体 在此方案中,按键盘上的逗号键,然后键入常规字符U+002C逗号
,
。文本字段设置为一种字体,其中逗号的形状使其看起来像泰米尔语字母I,但实际上它仍然是一个逗号
数据库中将存储一个逗号,搜索工具将其匹配为逗号;如果您将它从数据库中拉出来,并以Bamini字体显示,那么它将看起来像泰米尔字母I,但以任何标准字体显示,就像您用来检查数据库的字体一样,并且它将看起来像逗号
视觉编码字体是我们用来处理没有标准编码的语言脚本的方式,但它们现在不应该被使用
现代操作系统提供了本地泰米尔键盘和字体(例如在Windows下,Nirmala用户界面)。使用这种方法,用户可以在一个普通的文本字段(没有特殊的字体设置)中输入一个真正的Unicode字符U+0B87泰米尔字母I
இ代码>,在数据库中看起来应该是一样的,在语义上也应该是适当的。经过一长串的试验,我终于找到了在打印机中打印泰米尔字符的替代解决方案。
注意:硬件技术支持人员告诉我,许多热敏打印机不接受通过原始打印机助手类发送的泰米尔字符
因此,我设计了一份crsytal报告并尝试打印,立即获得了成功。
(我的打印机是3英寸热敏打印机)在连接字符串中放入如下内容:
id=我的用户;密码=我的密码;数据库=一些_db123;字符集=utf8
并将说明
更改为字符集utf8
(或utf8mb4)
有关更多调试的信息,请参见以下内容:基本上,Bamini不是unicode标准。它有自己的编码,所以当你阅读时,你需要解码它,这意味着你需要在内容上设置bamini字体。当您尝试打印时,系统不会设置为bamini字体
因此,解决方案应该是在打印时使用unicode字体而不是bamini字体,或者设置bamini字体。是否调试并检查从文本框检索的字符串是否具有正确的数据?我建议记录字符串中每个字符的UTF-16值-例如,foreach(文本中的字符c){Console.WriteLine(((ushort)c).ToString(“x4”);}
Next,请向我们展示您用于将数据保存到数据库的代码。在将DB列中的字节流用作Unicode字符之前,您可能必须对其进行UTF-8解码。@user6060561:我尝试过编码,但在打印机中仍有相同的输出。Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes(countryname))再看一眼,我发现存储的字符串“e;j_ah”不是文本的UTF-8表示形式,因此它没有正确的UTF-8解码。数据库中是否有其他列类型选项?在对AddWithValue()的调用中是否用Encoding.UTF8.GetBytes(textBox1.Text)替换了textBox1.Text?如果是,但它不起作用,请尝试参数集合中更特定于类型的“Add”方法之一。e、 g.带有参数名和SqlDbType的Add()方法。