Oracle jdbc读取为UTF-8字符 (ojdbc8)导致乱码问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38340127/article/details/89094606

获取返回的数据 首先初始化一系列数据

为每一列的列属性进行配置 如列名等

 

 

目前的不同一个byte[] 为 2  -63   3  (8中) 一个为 -63  3(6中)  

 

Ojdbc6中再此处 获取到数据库返回的byte[]数组GBK类型

这一步 获取 byte[]数组

 

接着讲获取到的byte数组 变为java中的char  放置在rowspacehchar中  再getString时候调用

 

将ascii码转换为java的chars ,ojdbc6中获取到的为GBK的byte[]

 

Ojdbc8中

该方法 获取数据库的byte[]数组也为gbk类型(张三的gbk   byte)

下列方法为 获取到Oracle 的返回数组方法(readRxd()方法)

 

 

Ojbc8为在getString时候对byte[]数组生成新的String   与Ojbc6中不同

currentRow 表示当前行数   paramInt表示第几列

列数减1 从0计算

String所在的方法

根据字符类型等进行专义

paramLong表示数据 所在byte[]内的开始位置 如2  表示第二位开始

paramInt  表示该数据所在byte[]中的长度  如4  表示 第二位开始共占有4位  

以上两个参数与用于获取对应数据在byte[]中的起始位置 从而去除String的byte数组

源库为ascii故用方法一

发现转换的方法有错(第一个为ojdbc6的方法)

public static final int convertASCIIBytesToJavaChars(byte[] paramArrayOfByte, int paramInt1,

char[] paramArrayOfChar, int paramInt2, int paramInt3)

 

{

int k = paramInt2 + paramInt3;

int i = paramInt2;

for (int j = paramInt1; i < k; j++) {

paramArrayOfChar[i] = ((char) (0xFF & paramArrayOfByte[j]));

i++;

}

return paramInt3;

}

下列为ojdbc8的装换方法中所采用的的转换 并未进行0xFF

public static final int convertASCIIBytesToJavaChars2(byte[] paramArrayOfByte, int paramInt1,

char[] paramArrayOfChar, int paramInt2, int paramInt3)

 

{

int k = paramInt2 + paramInt3;

int i = paramInt2;

for (int j = paramInt1; i < k; j++) {

paramArrayOfChar[i] = ((char) (paramArrayOfByte[j]));

i++;

}

 

return paramInt3;

}

 

为什么要用0XFF  :在转char时候 先获取该char 对呀的ascii值 即byte转为int

     首先: java中的二进制采用的是补码形式

      其次:byte占8位,int占32位,将byte强制转换为int型时,如果没有做 & 0xff运算,且byte对应的值为负数的话,就会对高位3个字节进行补位,这样就有可能出现补位误差的错误。

      举例来说,byte型的-1,其二进制(补码)为11111111(即0xff),转换成int型,值也应该为-1,但经过补位后,得到的二进制为11111111111111111111111111111111(即0xffffffff),这就不是-1了,对吧?

      而0xff默认是int型,所以,一个byte跟0xff相与,会先将那个byte转化成int型运算,这样,结果中的高位3个字节就总会被清0。

猜你喜欢

转载自blog.csdn.net/qq_38340127/article/details/89094606
今日推荐