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

针对汉字乱码

末尾乱码:末尾第二个字节的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)?对在末尾和开始、中间都有的处理

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

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

在以上每一项中,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))--出错

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却要用于实际的传输,所以就不得不考虑字节序的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值