Używam Borland C++ Builder 2009, a moja aplikacja jest tłumaczona na kilka języków, w tym polski.C++ towupper() nie konwertuje określonych znaków
Dla niewielkiego elementu funkcji używam towuppper(), aby zamonetować ciąg znaków, aby położyć nacisk na to, gdy po raz pierwszy został zignorowany przez użytkownika.
Oryginalny ciąg jest ładowany z dll językowej, do obiektu UTF16 wstring i przekonwertować tak:
int length = mystring.length() ;
for (int x = 0 ; x < length ; x++)
{
mystring[x] = towupper(mystring[x]);
}
To wszystko działa dobrze, z wyjątkiem Polski, gdzie dodaje się zdanie: „Rozumiem ryzykowność wykonania Tej Operacji”zamienia się w "ROZUMIEM RYZYKOWNO SC WYKONANIA tEJ Operacji" zamiast "ROZUMIEM RYZYKOWNO SC WYKONANIA tEJ Operacji"
(zauważ, że te dwa ostatnie znaki z napisem "ryzykowność" nie konwersji).
To nie jest tak, że nie ma dostępnych wielkoformatowych wariantów tego znaku w Unicode. Znak Unicode 346 rozwiązuje problem. http://www.fileformat.info/info/unicode/char/015a/index.htm
Czy jest to kwestia przestarzałej biblioteki w mojej przestarzałej instalacji kompilatora, czy też brakuje mi czegoś innego?
Czy te znaki są znormalizowane, czy składają się z wielu połączonych jednostek kodu? – user2079303
Nie powinna to być przestarzała biblioteka, ponieważ zarówno 'ś' jak i' Ś' były obecne w Unicode v.1.1, z 1993 roku.Jeśli tak, to błąd twórcy tej funkcji. – usr2564301
Do czego jest ustawiony twój region C? "Wielkopostaciowa wersja ch lub niemodyfikowana ch, jeśli w bieżącym locale C nie jest wyświetlana żadna wielka wersja." Czy jesteś w locale w Unicode? 'std :: setlocale (LC_ALL," en_US.utf8 ");'? Z http://en.cppreference.com/w/cpp/string/wide/towupper kilka łatwych do odczytania dokumentów na temat funkcji znalezionej przez google. Jeśli to nie rozwiąże problemu, podaj [mcve] – Yakk