2012-02-27 36 views
6

Tôi đang cố gắng viết mã để so sánh hai chuỗi. Trong cửa sổ tôi có thể sử dụng strcmp nhưng tôi muốn viết cho chuỗi ký tự nhiều byte để nó tương thích với tất cả nền tảng khác Tôi có thể sử dụng memcmp không? nếu không thì có bất kỳ API nào khác mà tôi có thể sử dụng hoặc tôi cần phải viết API của riêng mình.Tôi có thể sử dụng memcmp hai so sánh chuỗi ký tự nhiều byte không?

+3

Tùy thuộc vào việc hai chuỗi có đang sử dụng cùng một mã hóa hay không. –

Trả lời

1

Nếu các chuỗi đều sử dụng cùng một mã hóa, memcmp sẽ hoạt động tốt. Tuy nhiên, hãy nhớ rằng các ký tự rộng có kích thước khác nhau trên các nền tảng khác nhau.

Nếu các chuỗi sử dụng mã hóa khác nhau, bạn sẽ cần một thư viện như ICU để xử lý.

2

Nếu hai chuỗi đang sử dụng cùng một mã hóa, bạn có thể sử dụng memcmp. Nếu họ đang sử dụng UTF-8, bạn thậm chí có thể sử dụng strcmp, vì 0 không xuất hiện trong các chuỗi được mã hóa UTF-8. Một tùy chọn khác là chuyển đổi chuỗi của bạn thành các ký tự rộng bằng cách sử dụng mbstowcs.

+0

Điều này sẽ có âm bản sai - hai chuỗi giống nhau có thể được mã hóa thành các mẫu byte khác nhau. Bạn cần phải so sánh với một chức năng hiểu biết Unicode. – StilesCrisis

+0

@StilesCrisis - Bạn có thể cung cấp ví dụ về cách các chuỗi giống nhau có thể có mã hóa UTF-8 khác nhau không? Hoặc, cho rằng vấn đề, làm thế nào điều này có thể xảy ra với bất kỳ mã hóa signle khác (như ISO 8859-1)? Tôi đã làm cho điểm mà các chuỗi cần thiết để được sử dụng cùng một mã hóa. –

+0

@Ted Hopp: Với UTF-8, bạn có thể mã hóa một ký tự ở dạng quá dài (một chuỗi giải mã thành giá trị nên sử dụng chuỗi ngắn hơn: câu này là từ wikipedia). Trong trường hợp này, memcmp trả về câu trả lời sai nhưng hàm so sánh nhận thức UTF-8 trả về câu trả lời đúng ... – Malkocoglu

5

Bạn phải cẩn thận. Tôi không phải là một chuyên gia về mã hóa Unicode/đa byte, nhưng tôi biết rằng với dấu phụ đôi khi hai chuỗi có thể được coi là bằng nhau khi byte của chúng không giống hệt nhau. Bạn nên sử dụng các API được kiểm tra trước, vì mã hóa chuỗi có thể trở nên khá lộn xộn.

Xem the old new thing on case mapping. Tôi không thể nghĩ một tham chiếu cho dấu phụ nhưng nếu tôi làm thì tôi sẽ đăng nó.

+0

Điều này là chính xác. Đối với một số trường hợp, một 'memcmp' sẽ hoạt động. Đối với tính chính xác 100% và đặc biệt nếu Unicode dưới mọi hình thức có liên quan, 'memcmp' sẽ không hoạt động. Ngay cả các ký tự đơn giản như 'é' cũng có thể được biểu thị bằng nhiều cách - hoặc là' é' (một ký tự Unicode), hoặc như '´' kết hợp với' e' (trong hai ký tự Unicode). Hầu hết thời gian, những thứ này không bị lẫn lộn và phù hợp, vì vậy bạn có thể không thấy bất kỳ vấn đề gì lúc đầu, nhưng cuối cùng nó sẽ cắn bạn. – StilesCrisis

+0

Một cách khác trong đó các chuỗi có thể được 'xem xét' bằng nhau, nhưng không bằng byte là nếu so sánh của bạn là trường hợp bất biến. Trong trường hợp này, bạn cần phải thực hiện trường hợp được gọi là trường hợp gấp, cho phép so sánh trường hợp trên, chữ thường, chữ hoa và chữ thường bất biến (như đã nêu ở trên có thể trong bộ nhớ được biểu diễn dưới dạng nhiều điểm mã ... hoặc không). – Bingo

+0

Bình đẳng sau khi bình thường hóa không giống nhau. Đó là toàn bộ điểm chuẩn hóa. OP đã hỏi liệu hai chuỗi ký tự có bằng nhau không, cho dù chúng có tương đương hay không. –

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