liveonsky
作者liveonsky·2019-03-18 18:26
数据库开发工程师·sr

DB2乱码(开始和结束,字符串中间没有好的办法)

字数 2751阅读 1915评论 0赞 1

针对汉字乱码
末尾乱码:末尾第二个字节的ASCII的值大于224 或 末尾第一个字节的ASCII的值大于224 去掉办法:case when length(colname)>1 and ascii(substr(colname,length(colname),1))>224 then 去掉最后一位

                                     when length(colname)>2 and ascii(substr(colname,length(colname)-1,1))>224 then 去掉最后两位
                                     colname                                 end              

开始乱码:第一个字节的ASCII的值大于128且小于224 , 且 第二个字节的ASCII值大于128 为前两位乱码 否则首位乱码 去掉办法:case when length(colname)>2 and ascii(substr(colname,1))>128 and and ascii(substr(colname,1))< 224 and and ascii(substr(colname,2,1)>128 then 去掉前两位 when length(colname)>1 and ascii(substr(colname,1))>128 and and ascii(substr(colname,1))< 224 then 去掉第一位 colname end

详见:
用 substr截取函数会产生乱码,用right或left会把乱码替换为空格
values (ascii(substr('硬拷贝',1,1)),ascii(substr('拷贝',1,1)),ascii(substr('贝',1,1)),ascii(left('硬拷贝',1))),

   (ascii(substr('硬拷贝',2,1)),ascii(substr('拷贝',2,1)),ascii(substr('贝',2,1)),ascii(left('硬拷贝',1))),
   (ascii(substr('硬拷贝',3,1)),ascii(substr('拷贝',3,1)),ascii(substr('贝',3,1)),ascii(left('硬拷贝',1)))

对于乱码无较好的办法,只能进行挨个字符判断
1)?对只有在末尾和开始才有的处理

  末尾第二个字节的ASCII的值大于224 且 第一个字节的ASCII值大于128 为乱码 或 末尾第一个字节的ASCII的值大于224?待确定
  开始第一个字节的ASCII的值大于128 或 第二个字节的ASCII值大于128 为乱码?待确定

2)?对在末尾和开始、中间都有的处理

对于能够导出的文件,原则上同样能够导入(即使含有乱码),在应用时处理?,
http://www.shangxueba.com/jingyan/108124.html

UTF-8 字符的最大长度可以为 4 个字节。非补充字符的最大长度为 3 个字节,而补充字符的长度为 4 个字节。

使用 UTF-8 格式的每个 UTF-16 字符的字节数可根据表 1 来确定。

表 1. UTF-8 的位分布
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.admin.nls.doc/doc/c0004816.html

在以上每一项中,u、w、x、y 和 z 串都是字符的位表示法。例如,U+0080 变换为二进制中的 11000010 10000000,而代用字符对 U+D800 U+DC00 变为 二进制中的 11110000 10010000 10000000 10000000。
values 128+64+32

values 128+64+32 =224
values 14*16 =224

VALUES (X'C3B1C3B2C3B3')
VALUES chr(65),chr(224)

VALUES GRAPHIC('硬拷贝'),substr(GRAPHIC('硬拷贝'),1,1)

VALUES VARGRAPHIC('硬拷贝'),substr(VARGRAPHIC('硬拷贝'),1,1)

values VARGRAPHIC(substr('贝',1,1))--出错

http://zh.wikipedia.org/wiki/UCS-2 ;

UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
读者可以用记事本测试一下我们的编码是否正确。需要注意,UltraEdit在打开utf-8编码的文本文件时会自动转换为UTF-16,可能产生混淆。你可以在设置中关掉这个选项。更好的工具是Hex Workshop。
UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广