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 字体。
您好,我开发了一个 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 字体。