aku*_*zma 8 java mysql unicode utf-8 character-encoding
在我的数据库中,我收到错误
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column
Run Code Online (Sandbox Code Playgroud)
我使用Java和MySQL 5.我知道4字节Unicode是合法的Java,但在MySQL 5中是非法的,我认为它可能导致我的问题,我想检查我的数据类型,所以这里是我的问题:怎么能我检查我的UTF-8数据是3字节还是4字节Unicode?
Jon*_*eet 17
UTF-8以1-3个字节对基本多语言平面中的所有内容(即U + 0000到U + FFFF)进行编码.因此,你只需要检查一切都在你的串是否是在BMP.
在Java中,这意味着检查是否有任何char(UTF-16代码单元)是高或低代理字符,因为Java将使用代理对来编码非BMP字符:
public static boolean isEntirelyInBasicMultilingualPlane(String text) {
for (int i = 0; i < text.length(); i++) {
if (Character.isSurrogate(text.charAt(i))) {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
Esa*_*ija 10
如果你不想支持BMP之外,你可以在将它们交给MySQL之前删除这些字符:
public static String withNonBmpStripped( String input ) {
if( input == null ) throw new IllegalArgumentException("input");
return input.replaceAll("[^\\u0000-\\uFFFF]", "");
}
Run Code Online (Sandbox Code Playgroud)
如果你想支持BMP以外,你需要的MySQL 5.5+,你需要改变一切,这是utf8
对utf8mb4(排序规则,字符集...).但是你也需要我不熟悉的驱动程序中的支持.在Java中处理这些字符也很痛苦,因为它们分布在2上chars
,因此需要在许多操作中进行特殊处理.
我发现在 Java 中去除非 BMP 字符的最佳方法如下:
inputString.replaceAll("[^\\u0000-\\uFFFF]", "\uFFFD");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9390 次 |
| 最近记录: |