W końcu wróciłem do mojego głównego zadania - przeniesienia raczej dużego projektu C++ z Windowsa na Maca.Wieloplatformowe łańcuchy znaków (i Unicode) w C++
Od razu uderzył mnie problem, w którym wchar_t ma 16 bitów w systemie Windows, ale 32 bitów na Macu. Jest to problem, ponieważ wszystkie łańcuchy są reprezentowane przez wchar_t, a tam będą przesyłane dane stringów pomiędzy maszynami Windows i Mac (zarówno w danych na dysku, jak iw sieciowych formularzach danych). Ze względu na sposób, w jaki działa, nie byłoby łatwo przekształcić ciągi w jakiś popularny format przed wysłaniem i odebraniem danych.
Naprawdę zaczęliśmy ostatnio obsługiwać znacznie więcej języków, dlatego zaczynamy zajmować się wieloma danymi Unicode (jak również obsługą języków pisanych od prawej do lewej).
Mogę teraz kombinować wiele pomysłów i powodować więcej problemów dla siebie niż potrzebnych, dlatego właśnie zadaję to pytanie. Uważamy, że przechowywanie wszystkich danych w łańcuchu w pamięci jako UTF-8 ma wiele sensu. Rozwiązuje problem wchar_t będący różnym rozmiarem, co oznacza, że możemy w łatwy sposób obsługiwać wiele języków, a także dramatycznie zmniejsza nasz ślad pamięci (mamy mnóstwo - głównie angielskich - napisów) załadowanych) - ale nie wygląda na to, że wiele osób robi to. Czy jest coś, czego nam brakuje? Istnieje oczywisty problem, z którym musisz sobie poradzić, gdzie długość łańcucha może być mniejsza niż rozmiar pamięci przechowującej dane ciągu.
Lub używa UTF-16 lepszym pomysłem? Czy powinniśmy trzymać się wchar_t i napisać kod, aby przekonwertować między wchar_t i, powiedzmy, Unicode w miejscach, w których odczytujemy/zapisujemy na dysku lub w sieci?
Zdaję sobie sprawę, że jest to niebezpiecznie bliskie pytania o opinie - ale denerwujemy się, że przeoczyliśmy coś oczywistego, ponieważ nie wydaje się, że istnieje wiele klas ciągów Unicode (na przykład) - ale jest jeszcze mnóstwo kod do konwersji do/z Unicode jak w boost :: locale, iconv, utf-cpp i ICU.
Tylko jedno słowo powiedzieć. http://utf8everywhere.org –