obsługa parametrów nazwa_pliku * ze spacjami za pomocą RFC 5987 daje wynik '+' w nazwach plików

Mam trochę starszego kodu, z którym mam do czynienia (więc nie, nie mogę po prostu użyć adresu URL z zakodowanym składnikiem pliku), który pozwala użytkownikowi pobrać plik z naszej strony internetowej. Ponieważ nasze nazwy plików są często w wielu różnych językach, wszystkie są przechowywane jako UTF-8. Napisałem kod do obsługi konwersji RFC5987 na odpowiedni parametr nazwa_pliku *. Działa to świetnie, dopóki nie mam nazwy pliku z znakami innymi niż asciii przestrzenie. Dla RFC znak spacji nie jest częścią attr_char, więc jest kodowany jako% 20. Mam nowe wersje Chrome, a także Firefoksa i wszystkie są konwertowane na% 20 do + podczas pobierania. Próbowałem nie kodować przestrzeni i umieszczać zakodowanej nazwy pliku w cudzysłowie i uzyskać ten sam wynik. Wyczułem odpowiedź przychodzącą z serwera, aby sprawdzić, czy kontener serwletów nie został zmiksowany z moimi nagłówkami i wyglądają dla mnie poprawnie. RFC ma nawet przykłady zawierające% 20. Czy czegoś brakuje lub czy wszystkie z tych przeglądarek mają błąd z tym związany?

Z góry bardzo dziękuję. Kod, którego używam do kodowania nazwy pliku, jest poniżej.

Piotr

public static boolean bcsrch(final char[] chars, final char c) {
    final int len = chars.length;
    int base = 0;
    int last = len - 1; /* Last element in table */
    int p;

    while (last >= base) {
        p = base + ((last - base) >> 1);

        if (c == chars[p])
            return true; /* Key found */
        else if (c < chars[p])
            last = p - 1;
        else
            base = p + 1;
    }

    return false; /* Key not found */
}

public static String rfc5987_encode(final String s) {
    final int len = s.length();
    final StringBuilder sb = new StringBuilder(len << 1);
    final char[] digits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    final char[] attr_char = {'!','#','

Aktualizacja

Oto zrzut ekranu z dialogiem pobierania, który otrzymuję dla pliku z chińskimi znakami ze spacjami, jak wspomniano w moim komentarzu.

,'&','\'','+','-','.','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','^','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','|', '~'}; for (int i = 0; i < len; ++i) { final char c = s.charAt(i); if (bcsrch(attr_char, c)) sb.append(c); else { final char[] encoded = {'%', 0, 0}; encoded[1] = digits[0x0f & (c >>> 4)]; encoded[2] = digits[c & 0x0f]; sb.append(encoded); } } return sb.toString(); }

Aktualizacja

Oto zrzut ekranu z dialogiem pobierania, który otrzymuję dla pliku z chińskimi znakami ze spacjami, jak wspomniano w moim komentarzu.

questionAnswers(1)

yourAnswerToTheQuestion