2013-06-28 42 views
17

Câu hỏi này áp dụng cho các thiết bị C#,. Compact Compact Framework 2 và Windows CE 5.C# string.IndexOf() trả về giá trị không mong muốn

Tôi gặp lỗi trong một .net DLL được sử dụng trên các thiết bị CE rất khác nhau trong nhiều năm, mà không hiển thị bất kỳ vấn đề nào. Đột nhiên, trên một mới Windows CE 5.0 thiết bị, lỗi này xuất hiện trong đoạn mã sau:

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

Tôi hy vọng tôi là -1, tuy nhiên điều này chỉ đúng cho đến ngày hôm nay, khi indexOf đột nhiên trở lại 5.

Kể từ khi hành vi này không xảy ra khi sử dụng

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

, tôi khá chắc chắn rằng đây là một phenomenom văn hóa dựa, nhưng tôi không thể nhận ra sự khác biệt thiết bị mới này làm cho. Nó là một phiên bản hầu như giống hệt nhau của một thiết bị được biết đến (chỉ là một cpu nhanh hơn và hội đồng quản trị mới).

Cả hai thiết bị:

  • chạy Windows CE 5.0 với nội địa hóa giống hệt
  • System.Environment.Version báo cáo '2.0.7045.0'
  • CultureInfo.CurrentUICulture và báo cáo CultureInfo.CurrentCulture 'en-GB' (cũng được thử nghiệm với 'de-DE')
  • 'tất cả' khóa đăng ký có liên quan bằng nhau.

Thiết bị mới có cài đặt trước CF 3.5, có tệp GAC mà tôi đã đổi tên thử nghiệm, không thay đổi hành vi được mô tả. Kể từ lúc chạy luôn luôn Phiên bản 2.0.7045.0 được báo cáo, tôi giả định các hội đồng này không có hiệu lực.

Mặc dù điều này không khó khắc phục, tôi không thể chịu nổi khi mọi thứ có vẻ huyền diệu. Bất kỳ gợi ý những gì tôi đã mất tích?

Edit: nó là nhận được người lạ và người lạ, xem ảnh chụp màn hình: screenshot

Một hơn: screenshot

+0

bạn chạy mã _exact_ này và bạn nhận được 5? –

+0

không chính xác tất nhiên, xem ảnh chụp màn hình của tôi ở trên. Tôi cũng sửa lại câu hỏi. Điểm thú vị: * s = "Doanh thu in"; // kết quả -1 * s = "Drucke Beleg aus"; // result -1 (!) xin lỗi lý do tôi thường xuyên chỉnh sửa, tôi mới tham gia SO. –

+0

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

Trả lời

0

thứ văn hóa thực sự có thể tỏ ra khá huyền bí trên một số hệ thống. Những gì tôi đã luôn luôn làm sau nhiều năm đau đớn là luôn luôn đặt thông tin văn hóa theo cách thủ công thành InvariantCulture nơi tôi không rõ ràng muốn có hành vi khác nhau cho các nền văn hóa khác nhau. Vì vậy, đề nghị của tôi sẽ là: Hãy chắc rằng IndexOf kiểm tra luôn luôn sử dụng các thông tin văn hóa tương tự, như vậy:

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

Tôi đã thử điều này, nhưng cùng một hành vi xuất hiện. Chỉ StringComparison.Ordinal đã sửa nó. Nó cũng có vẻ rất khó hiểu, tại sao hai không gian có thể được xử lý bằng một, trong khi 'string.Equals (" "," ");' (hai không gian so với một dấu cách) trả về false ... –

+0

'String.Equals' sử dụng so sánh thứ tự; hãy thử 'String.Compare (" "," ")' để thay thế. – Mormegil

+0

String.Compare trả về 1, vì vậy chúng không được nhận dạng như nhau. –

4

Tôi tin rằng bạn đã có câu trả lời bằng một tìm kiếm thứ

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

Bạn có thể đọc một nhỏ trong tài liệu cho số String Class có điều này để nói về chủ đề:

Phương pháp tìm kiếm chuỗi, chẳng hạn như String.StartsWith và String.IndexOf, cũng có thể thực hiện so sánh chuỗi nhạy cảm với văn hóa hoặc thứ tự. Ví dụ sau đây minh họa sự khác biệt giữa so sánh thứ tự và văn hóa nhạy cảm bằng phương pháp IndexOf.Một tìm kiếm văn hóa nhạy cảm trong đó văn hóa hiện tại là tiếng Anh (Hoa Kỳ) xem xét chuỗi con "oe" để khớp với chữ "œ". Bởi vì dấu gạch ngang mềm (U + 00AD) là ký tự không có chiều rộng bằng 0, tìm kiếm xử lý dấu gạch ngang mềm tương đương với Rỗng và tìm thấy kết quả khớp ở đầu chuỗi. Mặt khác, tìm kiếm theo thứ tự không tìm thấy kết quả phù hợp trong cả hai trường hợp.

+2

Tôi biết rằng đây là câu trả lời đúng cho câu hỏi "làm cách nào để khắc phục sự cố này?" - nhưng câu hỏi của tôi là: "tại sao điều này lại xảy ra?" –

+0

Để tìm hiểu, tôi đề nghị bạn lặp lại trought mỗi ký tự của chuỗi vấn đề của bạn trong gỡ lỗi. Có thể có một nhân vật trong đó bạn không nhìn thấy –

+0

điều này không thể giải thích tại sao nó hoạt động trên tất cả các thiết bị khác. Ít nhất VS Debugger không cung cấp bất kỳ ký tự ẩn nào khi copy + paste vào một trình soạn thảo hex. Xin lưu ý ví dụ với vòng lặp trên bảng chữ cái. –

0

Các tài liệu tham khảo tại http://msdn.microsoft.com/en-us/library/k8b1470s.aspx trạng thái:.

"tập kí tự bao gồm ký tự có thể bỏ qua, đó là ký tự không được xem xét khi thực hiện một sự so sánh ngôn ngữ hay văn hóa nhạy cảm Trong một tìm kiếm nền văn hóa nhạy cảm, nếu giá trị chứa một nhân vật có thể bỏ qua, kết quả tương đương với việc tìm kiếm với nhân vật đó đã bị loại bỏ. "

Đây là từ 4.5 tham chiếu, các tham chiếu từ các phiên bản trước không chứa gì giống như vậy. Vì vậy, hãy để tôi đoán: họ đã thay đổi các quy tắc từ 4.0 thành 4.5 và bây giờ không gian thứ hai của một chuỗi hai không gian được coi là "nhân vật có thể bỏ qua" - ít nhất là nếu công cụ nhận ra chuỗi của bạn là tiếng anh văn bản (như trong chuỗi ví dụ của bạn), nếu không thì không.

Và bằng cách nào đó trên thiết bị mới của bạn, một dll 4,5 được sử dụng thay vì dự kiến ​​2,0 dll.

Một dự đoán hoang dã, tôi biết :)

+0

Một dự đoán rất hoang dã nhưng hợp lý và có học thức. System.Environment.Version hiển thị 2.0.7045.0 tại thời gian chạy, vì vậy CF2 SP2 được sử dụng. Bên cạnh việc cài đặt CF2 này, có CF3.5 DLL hiện tại bổ sung. –

Các vấn đề liên quan