브라우저의 파일 다운로드 상자에 ASCII가 아닌 파일 이름을 표시하는 방법은 무엇입니까?

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

  •  02-07-2019
  •  | 
  •  

문제

ASCII가 아닌 형식으로 헤더 매개변수를 보내는 방법은 허용되지 않는 것 같습니다.

파일 다운로드 헤더는 일반적으로 다음과 같습니다.

콘텐츠 처리:부착;파일 이름="theascii파일 이름.doc"

filename 매개변수에 utf8로 인코딩된 문자열을 부수는 경우를 제외하고 Firefox는 이를 잘 처리하지만 IE는 문제를 발생시킵니다.

이있다 파일 이름을 인코딩하는 방법을 설명하는 CodeProject 문서입니다.

이 문서는 바이트를 16진수 인코딩하여 Bản Kiểm Kê.doc를 B%e1%ba%a3n%20Ki%e1%bb%83m%20K%c3%aa.doc로 인코딩합니다.

문제 #1:해당 문자열의 첫 번째 문자:ả의 값은 ả입니다. 해당 숫자를 16진수로 인코딩하면 %a3%1e가 됩니다.이 사람은 어떻게 %e1%ba%a3를 얻었나요?(분명히 여기에 간단한 것이 빠졌습니다)

문제 #2:IE는 이 인코딩을 인식하지만 Firefox는 그렇지 않습니다!무엇을 해야 할까요?

도움이 되었습니까?

해결책

질문 #1에 대한 답변 : 당신은 유니 코드와 UTF-8을 혼동하고 있습니다. 'value'의 16 진수 값은 0xa31e이지만 UTF-8 문자는 아닙니다. UTF-8에서 그 문자는 세 바이트를 통한입니다. 0xE1 0xBA 0xA3. URL 인코딩은 비 ASCII 인코딩에 대해 잘 정의되지 않았지만%E1%BA%A3은 해당 문자에 사용하기위한 유효한 UTF-8 인코딩입니다.

다른 팁

사양은 기본적으로 US-ASCII 이외의 것을 허용하지 않습니다.HTTP 헤더는 US-ASCII입니다.HTTP의 페이로드는 기본적으로 ISO 8859-1로 설정되어 있지만 이는 헤더가 아닌 콘텐츠 본문을 참조합니다.

틀림없이 옳은 일은 헤더에 비ASCII 데이터를 인코딩하기 위한 MIME 기술을 사용하는 것입니다. RFC 2047, 하지만 브라우저가 실제로 이를 지원하는지 여부는 알 수 없습니다.

편집하다: 아뇨, RFC 2047 섹션 ​​5에서는 인코딩된 형식이 Content-Disposition에서 허용되지 않는다고 명시적으로 명시하고 있습니다.운이 좋지 않은 것 같습니다. 표준이 없습니다.

편집 2: 표준이 있습니다 - RFC 2231 이것이 이제 어떻게 작동할지 정의합니다.일부 브라우저에서는 지원되지만 IE에서는 지원되지 않습니다.나는 찾았다 일부 테스트 케이스 작동 방식과 사용 가능한 브라우저 지원을 보여줍니다.

문제 #2의 경우 URL이 Internet Explorer와 Firefox의 파일 이름을 인코딩해야합니다. 유일한 차이점은 Firefox에서 RFC 2231 형식을 사용해야한다는 것입니다. 이것은 Firefox 3 및 Internet Explorer 7에 적용됩니다.

위에서 얻은 링크에서 E1 BA A3은 문자 코드가 아닌 언급 된 문자의 UTF-8 인코딩입니다.

문제 #2에 대한 답변 (일종의) :

한 브라우저의 명명 체계가 다른 브라우저에서 작동하지 않는다는 것을 발견 했으므로 유일한 솔루션은 예와 유사하게 각 브라우저마다 다르게 수행하는 것입니다. 여기.

링크가 사라지는 경우 솔루션은 기본적으로 다음과 같습니다.

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

물론 사용자 에이전트에 의해 브라우저가 IE인지 결정하는 것은 모든 종류의 일반적인 위험으로 가득 차 있습니다.

이 소리가 들리는 것처럼 북미 중심적으로,이 작업이 많은 브라우저 에서이 작업을 제어하지 않는 것이 중요하다면 사용자 에이전트가 차단되거나 수정 될 수있는 경우 파일 이름과 항상 UTF-8 인코딩 된 문자를 피하십시오. "다운로드"또는 무언가를 사용하십시오.

불행히도 현재 모든 사용자 에이전트에서 작동하는 단일 방법은 없습니다.

보다 http://greenbytes.de/tech/tc2231/ 테스트 사례의 경우 Microsoft, Google 및 Apple에 불평합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top