Como exibir um nome de arquivo não-ascii na caixa de download do arquivo em navegadores?

StackOverflow https://stackoverflow.com/questions/149058

  •  02-07-2019
  •  | 
  •  

Pergunta

Não parece ser uma forma aceitável de enviar para baixo um parâmetro de cabeçalho no formato não ascii.

O cabeçalho para download de arquivos normalmente se parece com

Content-Disposition: anexo; filename = "theasciifilename.doc"

Exceto se você quebra um utf8 string codificada no parâmetro nome do arquivo, o Firefox irá lidar com isso muito bem, enquanto o IE irá vomitar.

Há uma href="http://www.codeproject.com/KB/aspnet/NonUSASCII.aspx" rel="nofollow documento em CodeProject que explica um método para codificar o nome do arquivo.

Este documento codifica B?n KIEM Kê.doc a B% e1% BA% A3N% 20Ki% e1% bb% 83m% 20K% C3% aa.doc por hexagonal que codifica os bytes.

Problema # 1: o primeiro caractere em que string: um tem um valor de um - codificar esse número em Hex e você começa% a3% 1e. Como é que esse cara obter% e1%% a3 ba? (Estou obviamente faltando algo simples aqui)

Problema # 2: Enquanto IE reconhece essa codificação, o Firefox não faz! O que fazer?

Foi útil?

Solução

A resposta à pergunta # 1: Você está confundindo Unicode e UTF-8. O valor hexadecimal de 'A' é 0xA31E no entanto, que não é um personagem UTF-8. Em UTF-8 que requries caráter três bytes, 0xE1 0xBA 0xA3. codificação de URL não é bem definida para codificações não-ascii, mas% e1% BA% a3 é a válida UTF-8 codificação utilizada para esse personagem.

Outras dicas

As especificações basicamente não permitem outra coisa senão US-ASCII. cabeçalhos HTTP são US-ASCII. de HTTP carga padrão é ISO 8859-1, mas que se refere ao corpo conteúdo, e não os cabeçalhos.

Provavelmente a coisa certa a fazer seria usar a técnica de MIME para codificação de dados não-ASCII nos cabeçalhos, como descrito em RFC 2047 , mas eu não tenho idéia se os navegadores realmente apoiar isso.

EDIT: Whoops, não, RFC 2047 seção 5 explicitamente diz que a forma codificada não é permitido no Content-Disposition. Parece que você está fora de sorte -. Não existe um padrão

EDIT 2: Existe um padrão - RFC 2231 define como isso é agora deve funcionar. Ele tem o apoio de alguns navegadores, mas não é suportado no IE. Eu encontrei alguns casos de teste que demonstrar como ele funciona eo que o suporte ao navegador é disponíveis.

Para Problema # 2 você precisa URL codificar o nome do arquivo para o Internet Explorer e Firefox. A única diferença é que você precisa para usar o formato de RFC 2231 no Firefox. Isto aplica-se para o Firefox 3 e Internet Explorer 7.

No link você tem acima, a3 ba e1 é a codificação UTF-8 do personagem mencionado, não o código de caracteres.

Resposta (tipo de) para o problema # 2:

Uma vez que você descobriu que o esquema de nomeação em um navegador não funciona no outro, a sua única solução é fazê-lo de forma diferente para cada navegador, semelhante ao exemplo aqui .

No caso do link vai embora, a solução é basicamente:

1. If browser is IE URL encode filename
2. Generate Content-disposition header

de determinar claro se o navegador for IE por User-agent (que é a única maneira que você pode fazê-lo) é repleta de todos os tipos de perigo habitual.

centric Como norte-americana que pareça, se é importante que este trabalho em um grande número de navegadores que você não controla o que pode ter o User-agent bloqueada ou modificada, então simplesmente evitar caracteres UTF-8 codificado no filename e utilize sempre "download" ou algo assim.

Infelizmente, não há atualmente nenhuma maneira única que iria trabalhar em todos os agentes do utilizador.

Consulte http://greenbytes.de/tech/tc2231/ para casos de teste, em seguida, queixar-se a Microsoft, Google e Apple.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top