我有一个日语字符串 " ユーザー名",第一个字符看起来像空格,但它在Unicode上的数字是12288。因此,如果我使用 " ユーザー名".trim(),我会得到相同的字符串(trim无效)。 如果我在C++中使用trim,则可以正常工作。 有人知道如何在Java中解决这个问题吗? 是否有专门用于Unicode的trim方法?
StringUtils
类的替代方案,您还可以使用仅使用Java自己的库的Unicode-aware正则表达式:" ユーザー名".replaceAll("\\p{Z}", "")
或者,如果只想修剪字符串中的空格而不是删除它们:
" ユーザ ー名 ".replaceAll("(^\\p{Z}+|\\p{Z}+$)", "")
int character = 12288;
char[] ch = Character.toChars(character);
String input = new String(ch);
String normalized = Normalizer.normalize(input, Normalizer.Form.NFKC);
System.out.println("Hex value:\t" + Integer.toHexString(character));
System.out.println("Trimmed length :\t"
+ input.trim().length());
System.out.println("Normalized trimmed length:\t"
+ normalized.trim().length());
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html
您需要根据 Character.isWhitespace()
编写自己的trim()
方法。不幸的是,trim()
并不像其API文档所述那样:它仅删除ASCII空格,而不删除任何其他类型的空格。
我认为这是在Java中修剪日语字符串的简单方法
public static int getTrimmedLength(CharSequence s) {
int len = s.length();
int start = 0;
while (start < len && Character.isWhitespace(s.charAt(start))) {
start++;
}
int end = len;
while (end > start && Character.isWhitespace(s.charAt(end - 1))) {
end--;
}
return end - start;
}
public static String trimWhitespace(CharSequence s) {
StringBuilder sb = new StringBuilder(s);
while (sb.length() > 0 && Character.isWhitespace(sb.charAt(0))) {
sb.deleteCharAt(0);
}
while (sb.length() > 0 && Character.isWhitespace(sb.charAt(sb.length() - 1))) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}