Java 返回UTF-8格式的字符串,以便将其存储在数据库中

Java 返回UTF-8格式的字符串,以便将其存储在数据库中,java,encryption,utf-8,Java,Encryption,Utf 8,我正在用“一次性键盘”实现加密,返回的是我的数据库不喜欢的字符串 java.sql.SQLException:来自服务器的常规错误消息:“不正确的字符串值:'\xC2\x9C\xC2\x98u\xC2…' public String encrypt(String message, String key) { if (message.length() != key.length()) error("Lengths must be equal");

我正在用“一次性键盘”实现加密,返回的是我的数据库不喜欢的字符串

java.sql.SQLException:来自服务器的常规错误消息:“不正确的字符串值:'\xC2\x9C\xC2\x98u\xC2…'

    public String encrypt(String message, String key) {
            if (message.length() != key.length()) error("Lengths must be equal");
            int[] im = charArrayToInt(message.toCharArray());
            int[] ik = charArrayToInt(key.toCharArray());
            int[] data = new int[message.length()];

            for (int i=0;i<message.length();i++) {
                    data[i] = im[i] + ik[i];
            }

            return new String(intArrayToChar(data));
    }
     private int chartoInt(char c) {
            return (int) c;
    }

    private char intToChar(int i) {
            return (char) i;
    }

    private int[] charArrayToInt(char[] cc) {
            int[] ii = new int[cc.length];
            for(int i=0;i<cc.length;i++){
                    ii[i] = chartoInt(cc[i]);
            }
            return ii;
    }

    private char[] intArrayToChar(int[] ii) {
            char[] cc = new char[ii.length];
            for(int i=0;i<ii.length;i++){
                    cc[i] = intToChar(ii[i]);
            }
            return cc;
    }
公共字符串加密(字符串消息、字符串密钥){
if(message.length()!=key.length())错误(“长度必须相等”);
int[]im=charArrayToInt(message.toCharArray());
int[]ik=charArrayToInt(key.toCharArray());
int[]data=newint[message.length()];

对于(int i=0;i字符串类型旨在表示文本。字符串的实际内容是一个16位值的序列,表示编码为UTF-16/UCS-2的文本。虽然UTF-16是一个16位值的序列,但它不是任何16位值的序列。特别是,有一个16位值的子范围保留给re表示大于或等于216的代码点。这些值成对使用,称为代理项对。如果您有其中一个字符,但后面没有第二个这样的字符,则字符串的格式也不正确,无法转换为UTF-8

基本上,您的方法是不正确的。任意的
char
值序列不能转换为UTF-8…或者转换为任何字符集

你有两个选择:

  • 在数据库中以BLOB或字节数组(如果支持)的形式存储“加密的”。换句话说,更改数据库列类型

  • 字符
    值数组映射到
    字节
    数组,然后使用十六进制或base64或其他稳健的二进制文本编码方案对字节进行编码。这将(不可避免地)使“加密”字符串比原始字符串长


好了,没有其他实用选项。

字节不是字符串。您不应该使用字符串列。一次性填充几乎从来都不是一个好主意。DB中的列是VARCHARVARCHAR用于字符串。您没有处理字符串。无法更改数据库列typebyte[]benMessage=enMessage.getBytes(“UTF-8”);String cipherText=Base64.encodeBase64String(benMessage);//encode System.out.println(“加密消息UTF-8:+cipherText”);刚刚这样做,输出正常,但是..它比原始字符串大,我不能that@Reversed-您有一组不可能的需求。唯一的解决方案是更改其中一个需求。