Abh*_*bhi 5 java mysql string encoding utf-8
我在网站上有一个文本区域,用户可以在其中编写任何内容.当用户复制粘贴某些文本或包含非UTF 8字符的内容并将其提交给服务器时,会出现问题.
Java成功处理它,因为它支持UTF-16,但我的mySql表支持UTF-8,因此插入失败.
我试图在业务逻辑本身中实现某种方式,删除任何不适合UTF-8编码的字符.
目前我正在使用此代码:
new String(java.nio.charset.Charset.forName("UTF-8").encode(myString).array());
Run Code Online (Sandbox Code Playgroud)
但它用其他一些不起眼的字符替换不适合UTF-8的字符.这对最终用户来说也不好看.请问有人可以使用Java代码解决任何可能的解决方案吗?
编辑:例如,插入这些值时我得到的异常
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8A\x0D\x0A...' for column
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80\xF0\x9F...' for column
Run Code Online (Sandbox Code Playgroud)
UTF-8不是字符集,它是一种字符编码,就像UTF-16一样.
UTF-8能够将任何unicode字符和任何unicode文本编码为字节序列,因此不存在不适合UTF-8的字符.
您使用的构造函数String只接受一个字节数组(String(byte [] bytes)),根据javadocs:
通过使用平台的默认字符集解码指定的字节数组构造一个新的String .
它使用平台的默认字符集来解释字节(将字节转换为字符).不要使用它.相反,在将字节数组转换为时String,请指定您希望使用String(byte [] bytes,Charset charset)构造函数显式使用的编码.
如果您对某些字符有疑问,那很可能是由于在服务器端和客户端使用不同的字符集或编码(brownser + HTML).确保在任何地方都使用UTF-8,不要混合编码,也不要使用平台的默认编码.
一些阅读如何实现这一点:
也许这个问题的CharsetDecoder的答案有帮助。您可以将CodingErrorAction更改为 REPLACE 并在我的示例“?”中设置替换。这将为无效字节序列输出给定的替换字符串。在此示例中,读取并解码了UTF-8 解码器功能和压力测试文件:
CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder();
utf8Decoder.onMalformedInput(CodingErrorAction.REPLACE);
utf8Decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
utf8Decoder.replaceWith("?");
// Read stress file
Path path = Paths.get("<path>/UTF-8-test.txt");
byte[] data = Files.readAllBytes(path);
ByteBuffer input = ByteBuffer.wrap(data);
// UTF-8 decoding
CharBuffer output = utf8Decoder.decode(input);
// Char buffer to string
String outputString = output.toString();
System.out.println(outputString);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21911 次 |
| 最近记录: |