数据库中文字段是乱码,如何转码?

时间:2022-05-23 00:26:41
客户的数据库好像是使用了字符集是Latin1_General_BIN (即 ISO-8859-1),

英文和数字字段都可以正常读取,只有中文字段或中英文混合字段不行,有乱码。怎么办?

20 个解决方案

#1


是在哪里看到乱码?试试,先不要用 String 类型,将数据放到 Byte 数组中,看编码有没有问题。

然后试试:

strData = StrConv(bytData, vbUnicode)

#2


对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

#3


引用 1 楼 of123 的回复:
是在哪里看到乱码?试试,先不要用 String 类型,将数据放到 Byte 数组中,看编码有没有问题。

然后试试:

strData = StrConv(bytData, vbUnicode)
+10086

#4


引用 1 楼 of123 的回复:
是在哪里看到乱码?试试,先不要用 String 类型,将数据放到 Byte 数组中,看编码有没有问题。

然后试试:

strData = StrConv(bytData, vbUnicode)


我测试了一下,例如,数据库中name字段内容“陈幼净”,读入byte数组中是
数据库中文字段是乱码,如何转码?
从查询分析器中看到的是“³ÂÓ×¾»”

strconv函数转不过来,请指教

#5


数据库中文字段是乱码,如何转码?

#6


你“存入”记录的代码是如何写的?
在那儿,会不会有“编码转换”造成的一些格式不兼容呢?

#7


这里关键要看你读的时候,是否需要把这个字段作为某些查询的条件,比如where [name]='嗷嗷叫的老马'这样的.

如果不需要,仅仅是作为数据存储的话,那就可以存的时候直接用BASE64编码一下....

#8


引用 7 楼 myjian 的回复:
这里关键要看你读的时候,是否需要把这个字段作为某些查询的条件,比如where [name]='嗷嗷叫的老马'这样的.

如果不需要,仅仅是作为数据存储的话,那就可以存的时候直接用BASE64编码一下....


我现在需要通过id读取病人姓名,怎么转码?

#9


ISO/IEC 8859-1 编码表如下

   0 1 2 3 4 5 6 7 8 9 A B C D E F 
0x   
1x   
2x SP ! " # $ % & ' ( ) * + , - . / 
3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 
4x @ A B C D E F G H I J K L M N O 
5x P Q R S T U V W X Y Z [ \ ] ^ _ 
6x ` a b c d e f g h i j k l m n o 
7x p q r s t u v w x y z { | } ~   
8x   
9x   
Ax NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯ 
Bx ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ 
Cx À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï 
Dx Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß 
Ex à á â ã ä å æ ç è é ê ë ì í î ï 
Fx ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ 

"陈幼净"编码 = B3 C2 D3 D7 BE BB,当然显示 "³ÂÓ×¾»"。

#10


应该是你的控件字符集的问题。

#11


打开方式可以用 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A来选择。

#12


程序中调用iconv解码或者用MultiBytetoWideChar,WideChartoMultiByte来转码

#13


编码没有问题。在 ISO/IEC 8859-1 下显示 "³ÂÓ×¾»",说明其编码就是 B3 C2 D3 D7 BE BB。即汉字"陈幼净"的编码。

问题出在如何解释编码,也就是如何根据编码调用字库信息来显示文字图形。

#14


打个比方,我们早先一个名牌产品叫“马戏扑克”,大小王是小丑,上海出产的。盒子上印的是 MAXIPUKE,汉语拼音。

出口到美国却无人问津,因为美国人看到的是 Maxi Puke,最大呕吐。

#15


B3 C2 D3 D7 BE BB,用中文简体字库,显示出来就是 "陈幼净",无非是宋体、楷体之类的区别。

这个编码,用 ISO/IEC 8859-1 字库显示,就是 "³ÂÓ×¾»"。

#16


那要是他换成RichTextBox应该就能显示了?

#17



要分析用户的实际需求,为什么既要采用汉字,又要使用 ISO/IEC 8859-1 字库?

实际上在 TextBox 的属性中,就有 Font 可以选择字库。但有一个问题,如果选择了中文字库,那西文中对应于 A0 - FF 的编码就不能显示。老外也会认为“出了乱码”。因为大多数控制只能设置一种字体。

具体怎样做,要看同一个字段中是否需要兼容中文和编码大于 128 的西文。如果不需要,可以将用来显示不同字段的控件选不同的字体库。如果需要,就麻烦一些,需要通过分析 Unicode 识别出东西方文字,再像老马所说,利用 RichTextBox 的 SelectionFont 属性动态设置字体。

#18


str=new String(obj.getBytes("ISO-9958-1"),"GBK");

#19


哈哈,大家说得都差不多了,我顺便问下,楼主你这是哪种数据库。不同数据库的处理方式稍有区别,原理相通。

#20


大家说的对,就是变态的客户信息科的人,安装数据库时,选的这个字符集,他们又懒得改,就麻烦我们这些做开发的人。

#1


是在哪里看到乱码?试试,先不要用 String 类型,将数据放到 Byte 数组中,看编码有没有问题。

然后试试:

strData = StrConv(bytData, vbUnicode)

#2


对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

#3


引用 1 楼 of123 的回复:
是在哪里看到乱码?试试,先不要用 String 类型,将数据放到 Byte 数组中,看编码有没有问题。

然后试试:

strData = StrConv(bytData, vbUnicode)
+10086

#4


引用 1 楼 of123 的回复:
是在哪里看到乱码?试试,先不要用 String 类型,将数据放到 Byte 数组中,看编码有没有问题。

然后试试:

strData = StrConv(bytData, vbUnicode)


我测试了一下,例如,数据库中name字段内容“陈幼净”,读入byte数组中是
数据库中文字段是乱码,如何转码?
从查询分析器中看到的是“³ÂÓ×¾»”

strconv函数转不过来,请指教

#5


数据库中文字段是乱码,如何转码?

#6


你“存入”记录的代码是如何写的?
在那儿,会不会有“编码转换”造成的一些格式不兼容呢?

#7


这里关键要看你读的时候,是否需要把这个字段作为某些查询的条件,比如where [name]='嗷嗷叫的老马'这样的.

如果不需要,仅仅是作为数据存储的话,那就可以存的时候直接用BASE64编码一下....

#8


引用 7 楼 myjian 的回复:
这里关键要看你读的时候,是否需要把这个字段作为某些查询的条件,比如where [name]='嗷嗷叫的老马'这样的.

如果不需要,仅仅是作为数据存储的话,那就可以存的时候直接用BASE64编码一下....


我现在需要通过id读取病人姓名,怎么转码?

#9


ISO/IEC 8859-1 编码表如下

   0 1 2 3 4 5 6 7 8 9 A B C D E F 
0x   
1x   
2x SP ! " # $ % & ' ( ) * + , - . / 
3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 
4x @ A B C D E F G H I J K L M N O 
5x P Q R S T U V W X Y Z [ \ ] ^ _ 
6x ` a b c d e f g h i j k l m n o 
7x p q r s t u v w x y z { | } ~   
8x   
9x   
Ax NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯ 
Bx ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ 
Cx À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï 
Dx Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß 
Ex à á â ã ä å æ ç è é ê ë ì í î ï 
Fx ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ 

"陈幼净"编码 = B3 C2 D3 D7 BE BB,当然显示 "³ÂÓ×¾»"。

#10


应该是你的控件字符集的问题。

#11


打开方式可以用 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A来选择。

#12


程序中调用iconv解码或者用MultiBytetoWideChar,WideChartoMultiByte来转码

#13


编码没有问题。在 ISO/IEC 8859-1 下显示 "³ÂÓ×¾»",说明其编码就是 B3 C2 D3 D7 BE BB。即汉字"陈幼净"的编码。

问题出在如何解释编码,也就是如何根据编码调用字库信息来显示文字图形。

#14


打个比方,我们早先一个名牌产品叫“马戏扑克”,大小王是小丑,上海出产的。盒子上印的是 MAXIPUKE,汉语拼音。

出口到美国却无人问津,因为美国人看到的是 Maxi Puke,最大呕吐。

#15


B3 C2 D3 D7 BE BB,用中文简体字库,显示出来就是 "陈幼净",无非是宋体、楷体之类的区别。

这个编码,用 ISO/IEC 8859-1 字库显示,就是 "³ÂÓ×¾»"。

#16


那要是他换成RichTextBox应该就能显示了?

#17



要分析用户的实际需求,为什么既要采用汉字,又要使用 ISO/IEC 8859-1 字库?

实际上在 TextBox 的属性中,就有 Font 可以选择字库。但有一个问题,如果选择了中文字库,那西文中对应于 A0 - FF 的编码就不能显示。老外也会认为“出了乱码”。因为大多数控制只能设置一种字体。

具体怎样做,要看同一个字段中是否需要兼容中文和编码大于 128 的西文。如果不需要,可以将用来显示不同字段的控件选不同的字体库。如果需要,就麻烦一些,需要通过分析 Unicode 识别出东西方文字,再像老马所说,利用 RichTextBox 的 SelectionFont 属性动态设置字体。

#18


str=new String(obj.getBytes("ISO-9958-1"),"GBK");

#19


哈哈,大家说得都差不多了,我顺便问下,楼主你这是哪种数据库。不同数据库的处理方式稍有区别,原理相通。

#20


大家说的对,就是变态的客户信息科的人,安装数据库时,选的这个字符集,他们又懒得改,就麻烦我们这些做开发的人。

#21