【问题标题】:C# : Unable to print data as unicode characters from MYSQL databaseC#:无法从 MYSQL 数据库将数据打印为 unicode 字符
【发布时间】:2018-01-13 17:34:08
【问题描述】:

您好,我开发了一个 Windows 应用程序,它允许用户保存数据并以泰米尔字体查看数据。我安装了“Bamini”字体(泰米尔语字体),并将文本框和 datagridview 设置为 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

表结构:

          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-16 值 - 例如,foreach (char c in text) { Console.WriteLine(((ushort) c).ToString("x4")); }
  • 接下来,请向我们展示您用于将数据保存到数据库的代码。
  • 在将其用作 Unicode 字符之前,您可能必须对 DB 列中的字节流进行 UTF-8 解码。
  • @user6060561:我尝试进行编码,但打印机中的输出仍然相同。 Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes(countryname))
  • 再看一遍,我发现存储的字符串 ",e;j_ah" 不是您的文本的 UTF-8 表示,因此它没有正确地 UTF-8 解码。您的数据库中有其他列类型选项吗?

标签: c# mysql unicode printing tamil


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    id=my_user;password=my_password;database=some_db123;charset=utf8;

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

    查看更多调试信息:http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        谁能告诉我我在这里做错了什么?!

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

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

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

        视觉编码字体是我们过去用来处理没有标准编码的语言脚本的方式,但现在不应该使用它们——将 Bamini 扔进垃圾桶。

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

        【讨论】:

          【解决方案5】:

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

          所以将“国家”的声明改为:

          `Country` BLOB NOT NULL,   
          

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

          【讨论】:

          • 您在调用 AddWithValue() 时是否将 textBox1.Text 替换为 Encoding.UTF8.GetBytes(textBox1.Text)?如果是,但它不起作用,请尝试参数集合中更特定于类型的“添加”方法之一。例如带有参数名称和 SqlDbType 的 Add() 方法。
          猜你喜欢
          • 1970-01-01
          • 2021-03-23
          • 2015-11-16
          • 2015-07-22
          • 1970-01-01
          • 2013-06-01
          • 1970-01-01
          • 2014-08-23
          • 2022-01-25
          相关资源
          最近更新 更多