2017-02-06 7 views
3

XmlDocument에로드되기 전에 XML 문자열의 UTF-8 바이트 표시를 확인하는 몇 가지 단위 테스트가 있습니다. 모든 것이 Windows 7 64 비트를 사용하여 잘 작동하지만 Windows 10 64 비트에서 실행하려고 시도하는 동안 실패한 테스트가 있음을 알게되었습니다.UTF-8 바이트 기호 검사는 운영 체제에 따라 다른 값을 제공합니다.

약간의 조사가 끝나면 Windows 10에서는 XML 문자열이 프 루닝되고 (프리앰블이 있음), Windows 7에서는 XML 문자열이 프 루닝됩니다. 여기

는 코드입니다 :

public static string PruneUtf8ByteMark(string xmlString) 
    { 
     var byteOrderMarking = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); 
     if (xmlString.StartsWith(byteOrderMarking)) 
     { 
      xmlString = xmlString.Remove(0, byteOrderMarking.Length); 
     } 

     return xmlString; 
    } 

StartsWith 윈도우 10 사실, 같은 XML 문자열을 사용하고 있는지 윈도우 7 참고 거짓을 반환, 유일한 차이점은 여기 운영 체제.

아이디어가 있으십니까? 두 PC 모두 동일한 .NET 버전을 실행하는 x64이기 때문에 여기서 약간 손실됩니다.

편집 : 바이트 마크 검사가 사실 때문에 기호가 잘립니다 덜보다 윈도우 10에

public static string XmlString = "<?xml version=\"1.0\".... 

: 문자열을 통해 클래스에서 제공됩니다.

+0

문자열의 출처는 무엇입니까? – SLaks

+0

@SLaks 문자열은 더미 테스트 데이터에서 가져옵니다. 그것은 클래스에 래핑되고 public static을 통해 액세스 할 수있는 XML 문자열입니다. –

+0

문자열이 파일에서 읽히지 않으면 믿을 수 없습니다. 어떤 값으로 'byteOrderMarking'에 대한 디버거가 표시됩니까? – dlatikay

답변

2

문제는 문화에 민감한 비교의 원인입니다.

byteOrderMarking은 보이는 문자가 아니므로 비교 중에 트리밍됩니다.

는 다음과 같은 경우를 참조하십시오

"".StartsWith("") // = true 
"aa".StartsWith("") // = true 
"aa".StartsWith("", StringComparison.Ordinal) // = true 

그래서 모든 문자열이 빈 문자열로 시작합니다. 이제 byteOrderMarking로 :

var byteOrderMarking = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); 
byteOrderMarking.Equals("") // = False 
byteOrderMarking.Equals("", StringComparison.CurrentCulture) // = True 
byteOrderMarking.Equals("", StringComparison.Ordinal) // = False 

이제 우리는 그 byteOrderMarking을 볼 수는 현재의 문화 비교와 빈 문자열과 같다. byteOrderMarking으로 시작하는 문자열인지 확인하려고하면 빈 문자열과 비교하는 것이 좋습니다.

서수와 CurrentCulture의 차이는 첫 번째가 바이트와 바이트 비교이며 두 번째는 문화에 따라 정규화된다는 점입니다.

마지막으로 서수 문자열 (OrdinalIgnoreCase)을 사용하여 기술 문자열을 비교하는 것이 좋습니다.

+0

답변 주셔서 감사합니다.그래, 서수를 사용해야하는 이유를 이해하지만, 문자열 비교가 OS 버전에 따라 다른 이유를 아직도 이해하지 못합니다. –

+0

win10에서는 더 많은 새로운 지원 언어가 추가되었습니다. 그것은 관련 될 수 있습니다. .Net 프레임 워크는 Windows API에 자주 의존합니다. 따라서 os가 변경되면 프레임 워크가 영향을받을 수 있습니다. – Kalten