在Java中剪切日语字符串的问题

5

我有一个日语字符串 " ユーザー名",第一个字符看起来像空格,但它在Unicode上的数字是12288。因此,如果我使用 " ユーザー名".trim(),我会得到相同的字符串(trim无效)。 如果我在C++中使用trim,则可以正常工作。 有人知道如何在Java中解决这个问题吗? 是否有专门用于Unicode的trim方法?

6个回答

8
作为Mike提到的StringUtils类的替代方案,您还可以使用仅使用Java自己的库的Unicode-aware正则表达式:
" ユーザー名".replaceAll("\\p{Z}", "")

或者,如果只想修剪字符串中的空格而不是删除它们:

" ユーザ ー名 ".replaceAll("(^\\p{Z}+|\\p{Z}+$)", "")

这将替换字符串中间的空白字符。 - Pablo Retyk
请注意,正则表达式比标准的trim()方法要慢得多。如果性能成为问题(或者已经是问题),编写自己的无正则表达式的trim()可能值得你花费时间。至少,使用编译后的Pattern来执行replaceAll()。 - Michael Myers
嗯,这不适用于其他语言。我更喜欢ICU4J方法。 - Phil
Phil,我不确定我理解你的评论,为什么它不能推广到其他语言?它应该适用于所有Unicode空格。 - Fabian Steeg
非常感谢!我希望我能给这个点赞10次。 - el_stack

4
请查看Unicode规范化规范化器类。该类是Java 6中的新功能,但如果您使用早期版本的JRE,则可以在ICU4J库中找到等效版本。
    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());

3
尝试使用Apache Commons的StringUtils类。StringUtils.strip()方法应该适合您的需求。

这对于日语空格字符并不起作用。 - Ashika Umanga Umagiliya

2
从Java文档中可以解释为什么这不起作用。
如果此String对象表示空字符序列,或者由此String对象表示的字符序列的第一个和最后一个字符都具有大于“\ u0020”(空格字符)的代码,则返回对此String对象的引用。
你可以轻松地创造自己的版本。也许方法codePointAt可以用于此目的。

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html


2

您需要根据 Character.isWhitespace() 编写自己的trim()方法。不幸的是,trim()并不像其API文档所述那样:它仅删除ASCII空格,而不删除任何其他类型的空格。


0

我认为这是在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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接