Как убрать символы типа non-usa, en, ASCII, используя grep? - PullRequest
0 голосов
/ 27 января 2011

Я использую grep для анализа списка друзей, полученного через Facebook Open Graph API. В основном я могу делать то, что хочу, с помощью следующей команды, введенной в bash:

grep -aiPo '"name":"(.*?)","id":"[[:digit:]]*"' friends?blahblah-access-token-stuff

, который выдает список, который выглядит следующим образом:

"name":"John Day","id":"--id ommitted--"
"name":"Andria Cast\u00f1eda","id":"--id ommitted--" // let me draw your attention here
"name":"Jane Doe","id":"--id ommitted--"

Имена были изменены выше для сохранения конфиденциальности

Если вы заметили, в средней записи есть неэкранированная последовательность, которая соответствует тильде N. Есть ли простой способ вставить такие символы в программу java (мое основное намерение), чтобы java понимал, что \ u00f1eda такое юникод говорит за кудрявый п?

Я бы предпочел бы не решить эту проблему, проанализировав строку в java и вручную отключив unicode. Я бы очень предпочел дать команду grep, чтобы справиться с этой ситуацией, или другой GNU или инструмент с открытым исходным кодом, который широко доступен для bash.

В тот момент я передавал весь входной файл в виде файла в Java-программу, не беспокоясь о OMG, это escape-последовательность Юникода !!? Java естественным образом обнаружит символы Юникода и отобразит их в соответствующее внутреннее представление.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 января 2011

Java понимает Unicode. Вы предоставляете экранирование Java Unicode следующим образом:

String str = "\u00F6";

Таким образом, если вы передаете строку, такую ​​как "Andria Cast\u00f1eda", которая представляет собой экранированную последовательность, она должна обрабатываться правильно, без дополнительной обработки.

Вот также очень краткое, но простое для понимания введение:

Unicode в Java

Если вы все еще не уверены, попробуйте этот класс:

public class UnicodeExample {

    public static void main(String[] args) {

        String escaped = new String("\u00f1");
        String unescaped = new String("ñ");
        System.out.println(escaped);        
        System.out.println(unescaped);

        if(escaped.equals(unescaped)){
            System.out.println("The strings are the same!");
        }
        else {
            System.out.println("The strings are different!");
        }

    }

}
0 голосов
/ 27 января 2011

Общее решение невозможно, поскольку побочный поток данных, используемый grep, не может закодировать все символы Unicode.

...