Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:无法将MYSQL数据库中的数据打印为unicode字符_C#_Mysql_Unicode_Printing_Tamil - Fatal编程技术网

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

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”,而不是இந்த

您好,我已经开发了一个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()方法。