使用Java将数据丢失的Utf-16转换为Utf-8字符串

使用Java将数据丢失的Utf-16转换为Utf-8字符串,java,mysql,encoding,utf-8,Java,Mysql,Encoding,Utf 8,我必须插入99,9%为UTF-8但0.01%为UTF-16的文本。当我尝试使用Hibernate和Spring将其保存到我的Mysql数据库时,发生了异常。我甚至可以删除这些字符没有问题,所以我想将我所有的文本转换成UTF-8格式,并在数据丢失时保存到我的数据库中,这样就可以删除有问题的字符。我试过了 String string = "String holds Unicode in java, so all scripts can be combined. byte[] convertto

我必须插入99,9%为UTF-8但0.01%为UTF-16的文本。当我尝试使用HibernateSpring将其保存到我的Mysql数据库时,发生了异常。我甚至可以删除这些字符没有问题,所以我想将我所有的文本转换成UTF-8格式,并在数据丢失时保存到我的数据库中,这样就可以删除有问题的字符。我试过了

  String string = "String holds Unicode in java, so all scripts can be combined.

byte[] converttoBytes = string.getBytes("UTF-16");

String String=“String在java中持有Unicode,因此可以组合所有脚本

string = new String(converttoBytes, "UTF-8");
这些字节是二进制数据,但实际上用于存储以UTF-16编码的文本

public static String string(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.wrap(bytes);
    CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
    decoder.onMalformedInput(CodingErrorAction.REPORT);
    decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
    try {
        String s = decoder.decode(buffer).toString();
        if (!s.contains("\u0000")) { // Could be UTF-16
            return s;
        }
    } catch (CharacterCodingException e) { // Error in UTF-8
    }
    return new String(bytes, "UTF-16LE");
}
现在String认为字节代表UTF-8中的文本编码,并将其转换。这是错误的

现在要检测编码,UTF-8或UTF-16,最好是在字节而不是字符串上进行检测,因为该字符串会有可能丢失的错误转换

由于UTF-8的格式是这两种格式中最严格的,我们将检查这一种。 UTF-16还有一个表示ASCII的字节0,这在普通文本中几乎从未出现过

大概是

       if (!s.contains("\u0000")) { // Could be UTF-16
           s = new String(s.getBytes("Windows-1252"), "UTF-16LE");
       }
如果您只有一个字符串(例如来自数据库),那么


可能会起作用或造成更大的混乱。

字符串在java中使用Unicode,因此可以组合所有脚本

string = new String(converttoBytes, "UTF-8");
这些字节是二进制数据,但实际上用于存储以UTF-16编码的文本

public static String string(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.wrap(bytes);
    CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
    decoder.onMalformedInput(CodingErrorAction.REPORT);
    decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
    try {
        String s = decoder.decode(buffer).toString();
        if (!s.contains("\u0000")) { // Could be UTF-16
            return s;
        }
    } catch (CharacterCodingException e) { // Error in UTF-8
    }
    return new String(bytes, "UTF-16LE");
}
现在String认为字节代表UTF-8中的文本编码,并将其转换。这是错误的

现在要检测编码,UTF-8或UTF-16,最好是在字节而不是字符串上进行检测,因为该字符串会有可能丢失的错误转换

由于UTF-8的格式是这两种格式中最严格的,我们将检查这一种。 UTF-16还有一个表示ASCII的字节0,这在普通文本中几乎从未出现过

大概是

       if (!s.contains("\u0000")) { // Could be UTF-16
           s = new String(s.getBytes("Windows-1252"), "UTF-16LE");
       }
如果您只有一个字符串(例如来自数据库),那么


可能会起作用或造成更大的混乱。

你的问题没有意义。UTF-8和UTF-16不是字符,它们是unicode码点(字符)的编码。这极不寻常(因此不太可能)UTF-8中包含一些混合了UTF-16的字符,并且UTF-8可以支持作为UTF-16支持的所有字符(即使是那些UTF-16只支持“脏”黑客的字符)。你可能想描述一下你真正的问题。听上去,你的MySQL数据库是
utf8
,而不是
utf8mb4
,所以你不能存储unicode的一些更高的平面,看到了吗?你的意思是数据松动吗?是的。utf8mb4必须是,但它不在我的MySQL中。我不想因为一些字符h我不需要。因此,出于这个原因,我想删除它们。引用文档“提示:要使用utf8mb4节省空间,请使用VARCHAR而不是CHAR”。好的。但是我可以在不丢失整个表的情况下更改类型吗?你的问题没有意义。UTF-8和UTF-16不是字符,它们是unicode码点(字符)的编码。在UTF-8中混合一些UTF-16的字符是极不寻常的(因此也不太可能)。而且UTF-8可以支持作为UTF-16支持的所有字符(即使是那些UTF-16只支持“脏”黑客的字符)。你可能想描述一下你真正的问题。听上去,你的MySQL数据库是
utf8
,而不是
utf8mb4
,所以你不能存储unicode的一些更高的平面,看到了吗?你的意思是数据松动吗?是的。utf8mb4必须是,但它不在我的MySQL中。我不想因为一些字符h我不需要。因此,出于这个原因,我想删除它们。引用文档“提示:要使用utf8mb4节省空间,请使用VARCHAR而不是CHAR”。“好的。但是我能在不丢失整个表格的情况下更改类型吗?我看到我的错误,它不是UTF-16,这就是为什么结果是错误的,当我尝试从UTF-16转换到UTF-8是一些中文字符时。我看到我的错误,它不是UTF-16,这就是为什么结果是错误的,当我尝试从UTF-16转换到UTF-8是一些中文字符时。