2013-06-28 3 views
17

이 질문은 C#, Compact Framework 2 및 Windows CE 5 장치에 적용됩니다.C# string.IndexOf()에서 예기치 않은 값을 반환합니다.

문제가 보이지 않으면 서 수년 동안 매우 다른 CE 장치에서 사용 된 .net DLL에 버그가 발생했습니다. 그러나이 같이 IndexOf 갑자기 5.

을 반환 오늘날까지 단 사실,

string s = "Print revenue receipt"; // has only single space chars 
int i = s.IndexOf(" "); // two space chars 

내가 -1 것으로 예상 : 갑자기, 새 Windows CE 5.0 장치에이 버그는 다음 코드 등장

int i = s.IndexOf(" ", StringComparison.Ordinal); 

를 사용하는 경우이 문제가 발생하지 않기 때문에, 나는이 문화를 기반으로 한 현상이라고 확신 해요,하지만 난이 새로운 장치는 수의 차이를 인식 할 수 없습니다. 그것은 알려진 장치의 거의 동일한 버전입니다 (단지 더 빠른 CPU 및 새 보드).

두 디바이스 : 동일한 현지화와

  • 실행 윈도우 CE 5.0
  • System.Environment.Version 보고서 '2.0.7045.0'
  • CultureInfo.CurrentUICulture 및 CultureInfo.CurrentCulture 보고서 'EN-GB' ('de-DE'로도 테스트 됨)
  • 'all'관련 레지스트리 키가 동일합니다.

새 장치에는 설명 된 동작을 변경하지 않고 GAC 파일의 이름을 실험적으로 변경 한 CF 3.5가 사전 설치되어 있습니다. 런타임에는 항상 버전 2.0.7045.0이보고되기 때문에 이러한 어셈블리가 아무 효과가 없다고 가정합니다.

수정하기가 어렵지 않지만, 마술처럼 보일 때 나는 참을 수 없습니다. 내가 누락 된 어떤 힌트라도?

편집 : 이 screenshot

하나 더 : screenshot

+0

이 _exact_ 코드를 실행하면 5가됩니까? –

+0

정확히는 아닙니다. 위의 스크린 샷을 참조하십시오. 나는 또한 질문을 바로 잡았다. 흥미로운 점 : * s = "수익 인쇄"; // result -1 * s = "Drucke Beleg aus"; // result -1 (!) pls는 내가 자주 편집하는 것을 용서합니다. –

+0

http://i.stack.imgur.com/iGxNb.png –

답변

0

문화 물건은 정말 일부 시스템에서는 매우 마법으로 나타날 수는 낯선 사람과 낯선 사람을 받고, 스크린 샷을 참조하십시오. 내가 수년간 고통 스러울 때마다 항상 한 일은 입니다.은 수동으로 문화 정보를 수동으로 InvariantCulture으로 설정합니다. 다른 문화권에서는 다른 행동을 명시 적으로 원하지 않습니다. 그래서 내 제안은 다음과 같습니다 IndexOf 검사가 항상처럼, 같은 문화권 정보를 사용하는 것이 확인 :

int i = s.IndexOf(" ", StringComparison.InvariantCulture); 
+0

나는 이것을 시도했지만 같은 행동이 나타났다. StringComparison.Ordinal 만 해결했습니다. 주말이 시작되기 전에 중요한 차이점이 숨겨진 곳을 알아야합니다 .- 두 개의 공백을 하나의 공백으로 취급 할 수있는 이유를 이해하는 것은 매우 어려워 보입니다. 반면에'string.Equals ("", "");' (두 공간 대 한 공간) false를 반환합니다 ... –

+0

'String.Equals'는 서수 비교를 사용합니다; 'String.Compare ("", "") 대신 사용해보십시오. – Mormegil

+0

String.Compare는 1을 반환하므로 동일한 것으로 인식되지 않습니다. –

4

을 당신이 이미 당신은 작은을 읽을 수

int i = s.IndexOf(" ", StringComparison.Ordinal); 

서수 검색을 통해 답을 믿습니다 같은 String.StartsWith 및 경우 String.indexOf 등

문자열 검색 방법도 수행 할 수 있습니다 주제에 이런 말을 가지고 String Class에 대한 문서 섹션 문화적으로 민감한 또는 서문 문자열 비교. 다음 예제에서는 IndexOf 메서드를 사용하여 서수 및 문화권 구분 비교의 차이점을 보여줍니다.현재 문화권이 영어 (미국) 인 문화적으로 민감한 검색은 문자열 "oe"가 합자 "-"와 일치하는 것으로 간주합니다. 소프트 하이픈 (U + 00AD)은 너비가 0 인 문자이기 때문에 검색은 소프트 하이픈을 Empty와 동일하게 처리하고 문자열 시작 부분에서 일치하는 항목을 찾습니다. 반면 서수 검색은 어느 경우에도 일치하는 항목을 찾지 못합니다.

+2

이 질문에 대한 정답은 "어떻게 수정해야합니까?" -하지만 제 질문은 "왜 이런 일이 일어 났습니까?"입니다. –

+0

디버그에서 문제 문자열의 각 문자를 반복해서 처리하는 것이 좋습니다. –

+0

을 볼 수 없다는 문자가있어 다른 모든 장치에서이 장치가 작동하는 이유를 설명 할 수 없습니다. 16 진수 편집기에 복사 + 붙여 넣을 때 적어도 VS 디버거는 숨겨진 문자를 제공하지 않습니다. 알파벳을 둘러싼 예를 참고하십시오. –

0

http://msdn.microsoft.com/en-us/library/k8b1470s.aspx 상태에서 참조 :.

"문자 세트는 언어 또는 배양 성 비교를 수행 할 때 고려되지 않는 문자이다 무시할자를 포함 배양 성 검색, 값이 포함되어 있으면 무시할 수있는 문자 일 경우 결과는 제거 된 문자로 검색하는 것과 같습니다. "

이전 버전의 참고 자료에는 4.5 참고 자료에 나온 내용이 포함되어 있지 않습니다.

그래서 추측을 해봅시다. 규칙을 4.0에서 4.5로 변경했으며 이제는 두 개의 공간 시퀀스의 두 번째 공간이 "무시할 수있는 문자"로 간주됩니다. 적어도 엔진이 문자열을 영어로 인식하면 텍스트 (예 : 문자열 s와 유사). 그렇지 않은 경우

그리고 어떻게 든 새 장치에서 예상되는 2.0 dll 대신 4.5 dll이 사용됩니다.

내가 알듯이 :

+0

매우 자연스러운 추측이지만 합리적이고 교육적입니다. System.Environment.Version에는 2.0이 표시됩니다.런타임에는 7045.0이므로 CF2 SP2가 사용됩니다. 이 CF2 설치 외에도 CF3.5 DLL이 추가로 제공됩니다. –

관련 문제