Проблема обрезки японской нити в Java - PullRequest
5 голосов
/ 26 января 2009

У меня есть следующая строка (японский) "ユ ー ザ ー 名", первый символ "как" пробел, но его номер в юникоде 12288, поэтому, если я делаю "ユ ー ザ ー 名" .trim (), я получаю ту же строку ( отделка не работает). Если я делаю обрезку в C ++, это работает нормально. Кто-нибудь знает, как решить эту проблему в Java? Есть ли специальный метод обрезки для Unicode?

Ответы [ 5 ]

7 голосов
/ 26 января 2009

В качестве альтернативы классу StringUtils, упомянутому Майком, вы также можете использовать регулярное выражение с поддержкой Юникода, используя только собственные библиотеки Java:

" ユーザー名".replaceAll("\\p{Z}", "")

Или, чтобы действительно только обрезать, а не удалять пробелы внутри строки:

" ユーザ ー名 ".replaceAll("(^\\p{Z}+|\\p{Z}+$)", "")
4 голосов
/ 26 января 2009

Посмотрите на Нормализация Unicode и класс Normalizer . Класс является новым в Java 6, но вы найдете эквивалентную версию в библиотеке ICU4J , если вы используете более раннюю версию JRE.

    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 голосов
/ 26 января 2009

Попробуйте класс Apache Commons ' StringUtils . Метод StringUtils.strip () должен работать для вас.

2 голосов
/ 26 января 2009

Вам придется написать свой собственный метод trim(), основанный на Character.isWhitespace() - к сожалению, trim() не выполняет то, что заявляет его API: он удаляет только пробелы ASCII, а не любые другие виды пробелов.

2 голосов
/ 26 января 2009

Из документации по Java это объясняет, почему это не работает.

Если этот объект String представляет пустая последовательность символов или первая и последние символы персонажа последовательность, представленная этой строкой оба объекта имеют коды больше '\ u0020' (символ пробела), затем ссылка на этот объект String вернулся.

Вы могли бы легко сыграть свою собственную версию. возможно, для этой цели можно использовать метод codePointAt. * ​​1007 *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...