2012-03-15 3 views
1

해결할 수없는 UTF-16 인코딩 XML 및 Firefox에 문제가 있습니다.FireFox에서 UTF-16 문자 인코딩 문제가 발생했습니다.

맞춤 작업 항목 컨트롤을 만들기 위해 TFS11 웹 액세스 API를 사용하고 있습니다. 그 과 관련이 없지만 웹 서버 설정이나 응용 프로그램이 데이터를 보내는 방식을 혼란스럽게하지는 못한다고 말하는 것으로 충분합니다.

일반 작업 과정은 첨부 파일을 풀고 XML로 구문 분석 한 다음 XML로 작업하여 최종 사용자의 데이터를 렌더링하는 일반적인 워크 플로입니다. 이것은 모두 IE8, IE9 및 Chrome에서 완벽하게 작동합니다. 그러나 FireFox 11에서는 그렇지 않습니다.

여기 내 XML을 잡아 그것을 구문 분석하고있어 방법을 보여주는 코드 조각입니다 :

$.ajax({ 
    url: uri, 
    async: true, 
    dataType: "text", 
    complete: function (xhr, status) { 
     if (xhr.responseText != null) { 
      data = null; 
      if (window.DOMParser) { 
       parser = new DOMParser(); 
       var responseText = xhr.responseText; 
       data = parser.parseFromString(responseText, "text/xml"); 
      } 
     } 
    } 
}); 

문제는 xhr.responseText의 내용입니다. FireFox에서는 ��<?�x�m�l� �v�e�r�s�i�o�n�=�"�1�.�0�"� �e�n�c�o�d�i�n�g�=�"�u�t�f�-�1�6�"�?�>을 포함합니다 (등등).

처음 두 문자는 FF FE입니다. 내가 그것에 대해 읽었으며, 이것이 Byte Order Marker라는 것을 알고 있습니다. 왜 이해가 안되는가 올바르게 인코딩 된 텍스트 대신이 표시가 나타납니다.

여기 내 응답 헤더는 요청에서있다 :

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: application/octet-stream 
Server: Microsoft-IIS/7.5 
X-TFS-ProcessId: 0bc401d6-0b5d-47a4-85b8-114344957d22 
X-AspNetMvc-Version: 3.0 
Content-Disposition: attachment; filename=d187d991-550a-4f49-b379-3bea7f9518c8.xml 
X-AspNet-Version: 4.0.30319 
Persistent-Auth: true 
X-Powered-By: ASP.NET 
X-Content-Type-Options: nosniff 
X-FRAME-OPTIONS: SAMEORIGIN 
Date: Thu, 15 Mar 2012 17:15:00 GMT 
Content-Length: 7520 

해결 방법이 거기에 있습니까?

답변

3

응답에 맞는 인코딩을 보내시겠습니까? 파이어 폭스가 데이터의 BOM을보고 있지 않기 때문에 데이터가 UTF-8이 아닌 UTF-16임을 알 수 있습니다.

+0

데이터를 보내는 응용 프로그램은 TFS11입니다. 데이터 제공 방법을 변경할 수있는 능력이 전혀 없습니다. 이 시점에서 필자는 파이어 폭스의 버그이거나 TFS11의 버그라고 확신하지만 어느 것이 있는지 모른다. :) –

+1

여기 서버에서 보낸 헤더에 영향을 줄 방법이 없습니까? 실제로 그것은 둘 다 버그입니다. 서버가 인코딩을 나타내야하고 Firefox가 BOM을 찾아야합니다. send()를 호출하기 전에 XHR 객체에서 overrideMimeType ("text/plain; charset = UTF-16")을 호출하여 문제를 해결할 수 있습니다. 사용중인 라이브러리에서이를 수행하는 방법을 모릅니다. –

+2

그걸 고쳤어! 내'.ajax' 호출에 다음을 추가해야했습니다. beforeSend : function (xhr) { xhr.overrideMimeType ('text/plain; charset = UTF-16'); }, ' 감사합니다. –