2012-05-17 20 views
11

w Objective-C, to jest martwy prosta:Jak zmienić wielkość liter łacińskich znaków UTF-8 w C++?

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

W C++, co jest równoważne? Czy ktoś może podać poprawny kod dla tego, który wytwarza ten sam wynik? Czy istnieje dobry sposób na zrobienie tego w STL bez polegania na ICU, Boost lub jakichkolwiek innych bibliotekach innych firm?

Mój obecny zakaz rozwiązaniem jest:

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

Napisz własną funkcję http://www.cplusplus.com/forum/beginner/70692/ –

+2

Twoje obecne rozwiązanie nie wygląda na całkiem przyzwoite! – fluffy

+0

@ Fluffy Zgadzam się! Chciałbym zawrzeć to "nie-rozwiązanie" w funkcji pomocnika i nazwać to całkiem dobrym rozwiązaniem. – dasblinkenlight

Odpowiedz

5

Problem okazuje się być niewiarygodnie skomplikowany w C++. Jest tylko jedna biblioteka, o której wiem, że ma absolutną rację, biorąc pod uwagę normalizację unicode i inne problemy z punktami znakowymi nie niższymi-128-ASCII.

IBM's ICU

Jest ogromny, ale robi wszystko poprawnie. Toupper i tolower niestety niestety niestety nie istnieją i nie ma dostępnych innych konstrukcji C++.

+0

Pytanie jednoznacznie wykluczyło OIOM. –

+0

@Adrian Prawda, ale wydaje się, że rzeczywistość sytuacji przeważy nad pytaniem. NSString in objc to tablica znaków unicode i wykorzystuje ICU pod maską. W tym przypadku, w czystym C++, zasadniczo musiałbym włączyć ICU, aby uzyskać tę samą funkcjonalność.(Na szczęście moją platformą docelową są iOS i Android, więc naprawdę mógłbym mieć oddzielne pliki _ios i _android, które łączą się z platformami: objc i java). – drhr

2

Jest tolower, co jest specyficzne narodowe, ale nie sądzę, że to zadziała z UTF-8 strun.

Właściwe rozwiązanie zawsze będzie zależało od ustawień narodowych, ponieważ reguły dotyczące poszczególnych przypadków zależą od języka. Na przykład mała litera "I" nie zawsze jest "i".

+0

Problem z 'tolower',' towlower', itp. Polega na tym, że zakładają one relację jeden do jednego pomiędzy znakami wejściowymi i wyjściowymi. To nie działa dla Unicode z powodu odwzorowań takich jak upper ("ß") = "SS", a to nawet nie bierze pod uwagę, że same znaki mają zmienną długość w UTF-8 i UTF-16. – dan04

+0

@ dan04: Czy są jakieś znaki, których kodowanie na małych i dużych literach różni się długością? Pojawi się to jednak tylko w UTF-8, ponieważ UTF-16 koduje BMP w 16 bitach, a SMP nie ma wielkich lub małych liter. – MSalters

+0

@ dan04: Tak, istnieją ograniczenia dla tolower, ale pytanie wprost wymagało standardowego rozwiązania biblioteki i wykluczało biblioteki stron trzecich. Jest to najlepsze, co możesz zrobić z tymi wymaganiami. –

Powiązane problemy