2012-05-17 25 views
11

Trong Objective-C, nó chết đơn giản:Làm thế nào để thay đổi trường hợp của chuỗi UTF-8 latin trong C++?

NSLog(@"%@", [@"BAÑO" lowercaseString]); // Outputs "baño". 

Trong C++, tương đương là gì? Có ai có thể cung cấp mã hợp lệ cho việc này để tạo ra cùng một đầu ra không? Có một cách STL đẹp để làm điều này mà không dựa vào ICU, Boost, hoặc bất kỳ libs bên thứ 3 nào khác không?

phi giải pháp hiện tại của tôi là:

using namespace std; 
string s = "BAÑO"; 
wstring w(s.begin(), s.end()); 
transform(w.begin(), w.end(), w.begin(), towlower); 
// w contains "baÑo" 
+0

viết chức năng của riêng bạn http://www.cplusplus.com/forum/beginner/70692/ –

+2

Giải pháp phi hiện tại của bạn có vẻ khá tốt với tôi! – fluffy

+0

@fluffy Tôi đồng ý! Tôi muốn bọc "không giải pháp" vào một hàm trợ giúp, và gọi nó là một giải pháp tốt darn tốt. – dasblinkenlight

Trả lời

5

Sự cố này trở nên cực kỳ phức tạp trong C++. Chỉ có một thư viện mà tôi biết được rằng nó hoàn toàn đúng khi cân nhắc việc chuẩn hóa unicode và các vấn đề khác về điểm ký tự không thấp hơn 128-ASCII.

IBM's ICU

Nó lớn nhưng nó làm mọi thứ chính xác. toupper và tolower rơi ngắn trong vấn đề này không may và không có khác C + + xây dựng có sẵn.

+0

Câu hỏi đã loại trừ rõ ràng ICU. –

+0

@Adrian Đúng, nhưng có vẻ như thực tế của tình hình đã vượt qua câu hỏi. NSString trong objc là một mảng các ký tự unicode và nó sử dụng ICU dưới mui xe. Trong trường hợp này, trong C++ thuần túy, về cơ bản tôi sẽ phải kết hợp ICU để có cùng chức năng.(May mắn thay, các nền tảng mục tiêu của tôi là iOS và Android, vì vậy thực sự tôi chỉ có thể có các tệp thực thi _ios và _android riêng biệt kết nối với nền tảng tương ứng của chúng: objc và java). – drhr

2

tolower, đó là miền địa phương cụ thể, nhưng tôi không nghĩ rằng nó sẽ làm việc với UTF-8 chuỗi.

Giải pháp chính xác sẽ luôn là ngôn ngữ cụ thể, vì quy tắc trường hợp tùy thuộc vào ngôn ngữ. Ví dụ: phiên bản chữ thường của 'I' không phải lúc nào cũng là 'i'.

+0

Vấn đề với 'tolower',' towlower', v.v. là chúng giả định một sự tương ứng một-một giữa các ký tự đầu vào và đầu ra. Điều đó không hoạt động đối với Unicode vì ánh xạ như trên ("ß") = "SS" và thậm chí không xem xét rằng các ký tự có độ dài thay đổi theo UTF-8 và UTF-16. – dan04

+0

@ dan04: Có bất kỳ ký tự nào có mã hóa chữ hoa và chữ thường có độ dài khác nhau không? Điều đó sẽ chỉ xuất hiện trong UTF-8 anyway, như UTF-16 mã hóa BMP trong 16 bit và SMP không có ký tự trên hoặc chữ thường. – MSalters

+0

@ dan04: Có, có những hạn chế để chấp nhận, nhưng câu hỏi được yêu cầu một cách rõ ràng về giải pháp thư viện chuẩn và loại trừ các thư viện của bên thứ ba. Vì vậy, đây là cách tốt nhất bạn có thể làm với những yêu cầu đó. –

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