it-swarm.com.de

Android: Wie analysiert man einen URL-String mit Leerzeichen zu einem URI-Objekt?

Ich habe eine Zeichenfolge, die eine URL mit Leerzeichen darstellt, und möchte sie in ein URI-Objekt konvertieren. Wenn es einfach ist, versuchen Sie es zu tun

String myString = "http://myhost.com/media/mp3s/9/Agenda of swine - 13. Persecution Ascension_ leave nothing standing.mp3";
URI myUri = new URI(myString);

es gibt mir 

Java.net.URISyntaxException: Illegal character in path at index X

dabei ist Index X die Position des ersten Leerzeichens in der URL-Zeichenfolge.

Wie kann ich myStringin ein URI-Objekt parsen?

60
whlk

Sie sollten tatsächlich URI-encode die "ungültigen" Zeichen verwenden. Da die Zeichenfolge tatsächlich die vollständige URL enthält, ist es schwierig, die URI-Kodierung ordnungsgemäß durchzuführen. Sie wissen nicht, welche Schrägstriche / berücksichtigt werden sollen und welche nicht. Sie können das nicht vorher auf einem Rohteil String vorhersagen. Das Problem muss wirklich auf einer höheren Ebene gelöst werden. Woher kommt das String? Ist es fest codiert? Dann ändern Sie es einfach entsprechend. Kommt es als Benutzereingabe? Überprüfen Sie es und zeigen Sie den Fehler an, damit der Benutzer sich selbst lösen kann.

Wenn Sie auf jeden Fall sicherstellen können, dass es sich bei nur um Leerzeichen in URLs handelt, die ungültig werden, können Sie auch einfach eine Zeichenfolge für Zeichenfolge mit %20 ersetzen:

URI uri = new URI(string.replace(" ", "%20"));

Oder wenn Sie sicherstellen können, dass es sich bei nur um den Teil nach dem letzten Schrägstrich handelt, der URI-codiert sein muss, können Sie dies auch mit Hilfe der Android.net.Uri -Dienstleistungsklasse tun:

int pos = string.lastIndexOf('/') + 1;
URI uri = new URI(string.substring(0, pos) + Uri.encode(string.substring(pos)));

Beachten Sie, dass URLEncoder für die Aufgabe ungeeignet ist, da sie dazu dient, Namen/Werte von Abfragezeichenfolge-Parametern gemäß application/x-www-form-urlencoded-Regeln (wie in HTML-Formularen verwendet) zu kodieren. Siehe auch Java-URL-Codierung von Abfragezeichenfolge-Parametern .

119
BalusC
Java.net.URLEncoder.encode(finalPartOfString, "utf-8");

Dies wird URL-encode der String.

finalPartOfString ist der Teil nach dem letzten Schrägstrich - in Ihrem Fall der Name des Songs, wie es scheint.

19
Bozho
URL url = Test.class.getResource(args[0]);  // reading demo file path from                                                   
                                            // same location where class                                    
File input=null;
try {
    input = new File(url.toURI());
} catch (URISyntaxException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
2
siddmuk2005

Um Leerzeichen, @ und andere unsichere Zeichen an beliebigen Stellen im URL-Pfad zu behandeln, verwenden Sie Uri.Builder in Kombination mit einer lokalen Instanz von URL, wie ich hier beschrieben habe:

private Uri.Builder builder;
public Uri getUriFromUrl(String thisUrl) {
    URL url = new URL(thisUrl);
    builder =  new Uri.Builder()
                            .scheme(url.getProtocol())
                            .authority(url.getAuthority())
                            .appendPath(url.getPath());
    return builder.build();
}
1
Phileo99

Ich habe diese Funktion geschrieben:

public static String encode(@NonNull String uriString) {
    if (TextUtils.isEmpty(uriString)) {
        Assert.fail("Uri string cannot be empty!");
        return uriString;
    }
    // getQueryParameterNames is not exist then cannot iterate on queries
    if (Build.VERSION.SDK_INT < 11) {
        return uriString;
    }

    // Check if uri has valid characters
    // See https://tools.ietf.org/html/rfc3986
    Pattern allowedUrlCharacters = Pattern.compile("([A-Za-z0-9_.~:/?\\#\\[\\]@!$&'()*+,;" +
            "=-]|%[0-9a-fA-F]{2})+");
    Matcher matcher = allowedUrlCharacters.matcher(uriString);
    String validUri = null;
    if (matcher.find()) {
        validUri = matcher.group();
    }
    if (TextUtils.isEmpty(validUri) || uriString.length() == validUri.length()) {
        return uriString;
    }

    // The uriString is not encoded. Then recreate the uri and encode it this time
    Uri uri = Uri.parse(uriString);
    Uri.Builder uriBuilder = new Uri.Builder()
            .scheme(uri.getScheme())
            .authority(uri.getAuthority());
    for (String path : uri.getPathSegments()) {
        uriBuilder.appendPath(path);
    }
    for (String key : uri.getQueryParameterNames()) {
        uriBuilder.appendQueryParameter(key, uri.getQueryParameter(key));
    }
    String correctUrl = uriBuilder.build().toString();
    return correctUrl;
}
0
hadilq