Tenho experimentado vários bits de código Java, tentando criar algo que codifique uma string contendo aspas, espaços e caracteres Unicode "exóticos" e produza uma saída idêntica à função encodeURIComponent do JavaScript .
Minha string de teste de tortura é: "A" B ± "
Se eu inserir a seguinte instrução JavaScript no Firebug:
encodeURIComponent('"A" B ± "');
—Então eu obtenho:
"%22A%22%20B%20%C2%B1%20%22"
Este é meu pequeno programa de teste em Java:
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class EncodingTest
{
public static void main(String[] args) throws UnsupportedEncodingException
{
String s = "\"A\" B ± \"";
System.out.println("URLEncoder.encode returns "
+ URLEncoder.encode(s, "UTF-8"));
System.out.println("getBytes returns "
+ new String(s.getBytes("UTF-8"), "ISO-8859-1"));
}
}
—Este programa produz:
URLEncoder.encode retorna% 22A% 22 + B +% C2% B1 +% 22 getBytes retorna "A" B ± "
Perto, mas sem charuto! Qual é a melhor maneira de codificar uma string UTF-8 usando Java para que ela produza a mesma saída do JavaScript encodeURIComponent
?
EDIT: Estou usando o Java 1.4 migrando para o Java 5 em breve.
fonte
[~'()!]
significa"~"
ou"'"
ou"("
ou")"
ou"!"
. :) Porém, eu recomendo aprender o básico do regex também. (Eu também não expandi isso, pois pelo menos duas outras respostas mostram o respectivo código Java.)"+"
por"%20"
é potencialmente destrutivo, pois"+"
é um caractere válido em caminhos de URI (embora não na string de consulta). Por exemplo, "a + b c" deve ser codificado como"a+b%20c"
; esta solução o converteria em"a%20b%20c"
. Em vez disso, usenew URI(null, null, value, null).getRawPath()
.Esta é a classe que criei no final:
fonte
%0A
que significa uma chave de retorno na entrada do Android, ou travará o js."%0A"
? Qual personagem seria o substituto? É apenas uma string vazia""
?Usando o mecanismo javascript que é fornecido com o Java 6:
Saída:% 22A% 22% 20B% 20% c2% b1% 20% 22
O caso é diferente, mas está mais próximo do que você deseja.
fonte
Eu uso
java.net.URI#getRawPath()
, por exemploO valor de
fixed
seráa+b%20c.html
, que é o que você deseja.O pós-processamento da saída de
URLEncoder.encode()
obliterará quaisquer vantagens que deveriam estar no URI. Por exemplolhe dará
a%20b%20c.html
, que será interpretado comoa b c.html
.fonte
http://a+b c.html
Eu criei minha própria versão do encodeURIComponent, porque a solução postada tem um problema, se houvesse um + presente na String, que deveria ser codificado, ele será convertido em um espaço.
Então aqui está minha aula:
fonte
URLEncoder.encode("+", "UTF-8");
produz"%2B"
, que é a codificação de URL adequada, portanto, sua solução é, minhas desculpas, totalmente desnecessária. Por que diabosURLEncoder.encode
não transforma espaços em%20
está além de mim.Eu vim com outra implementação documentada em http://blog.sangupta.com/2010/05/encodeuricomponent-and.html . A implementação também pode manipular bytes Unicode.
fonte
Usei com sucesso a classe java.net.URI assim:
fonte
Este é um exemplo direto da solução de Ravi Wallau:
Resultado:
https://www.website.com/document/Tom%20%26%20Jerry%20Manuscript.pdf
Ele também responde à questão pendente nos comentários de Loren Shqipognja sobre como passar uma variável String para
encodeURIComponent()
. O métodoscriptEngine.eval()
retorna umObject
, portanto, pode ser convertido em String porString.valueOf()
meio de outros métodos.fonte
para mim funcionou:
ou com um UriBuilder diferente
Na minha opinião, usar uma biblioteca padrão é uma ideia melhor do que pós-processamento manualmente. Além disso, a resposta @Chris parecia boa, mas não funciona para urls, como " http: // a + b c.html"
fonte
encodeURIComponent
.encodeURIComponent
retorna para?&
o resultado%3F%26%20
, mas sua sugestão retorna%3F%26+
. Sei que isso é mencionado várias vezes em outras perguntas e respostas, mas deve ser mencionado aqui, antes que as pessoas confiem cegamente.Isso é o que estou usando:
Ele vai além do Javascript ao codificar por cento cada caractere que não seja um caractere não reservado de acordo com o RFC 3986 .
Esta é a conversão oposta:
fonte
Eu encontrei a classe PercentEscaper da biblioteca google-http-java-client, que pode ser usada para implementar encodeURIComponent com bastante facilidade.
PercentEscaper de google-http-java-client javadoc google-http-java-client home
fonte
A biblioteca Guava tem PercentEscaper:
Escaper percentEscaper = new PercentEscaper("-_.*", false);
"-_. *" são caracteres seguros
falso diz PercentEscaper para escapar do espaço com '% 20', não '+'
fonte
Eu costumava
String encodedUrl = new URI(null, url, null).toASCIIString();
codificar urls. Para adicionar parâmetros após os existentes nourl
eu usoUriComponentsBuilder
fonte