2010-06-04 14 views
11

Jak napisać aspekt std :: codecvt? Chciałbym napisać te, które przechodzą od UTF-16 do UTF-8, które przechodzą od UTF-16 do aktualnej strony kodowej systemu (Windows, więc CP_ACP) i do strony kodowej OEM systemu (Windows, więc CP_OEM).Jak napisać aspekt std :: codecvt?

Preferowana jest platforma międzyplatformowa, ale MSVC w systemie Windows też jest w porządku. Czy są jakieś rodzaje samouczków lub coś takiego o tym, jak poprawnie korzystać z tej klasy?

+0

Można przyjrzeć się [na przykład w podręcznik libstdC++) (http://gcc.gnu.org/onlinedocs/libstdc++/manual/codecvt.html). –

+0

W przypadku ustawień regionalnych i aspektów jedyną znaną mi książką jest http://www.angelikalanger.com/iostreams.html, ale ma ona tylko kilka stron poświęconych kodekowi. –

+3

Nie mogę uwierzyć, że nikt nie ma pojęcia o tej klasie w bibliotece Standard - szczególnie biorąc pod uwagę, jak potencjalnie może to być przydatne ... –

Odpowiedz

9

Napisałem jeden oparty na iconv. Może być używany w oknach lub w dowolnym systemie operacyjnym POSIX. (Będziesz musiał oczywiście połączyć się z iconv).

Enjoy

Odpowiedź na "jak" pytanie jest następujące the codecvt reference. Nie mogłem znaleźć żadnych lepszych instrukcji w Internecie dwa lata temu.

Ważne uwagi

  • teoretycznie nie ma potrzeby do takiej pracy. codecvt_byname powinien wystarczyć na każdej standardowej platformie wspierającej. Ale w rzeczywistości istnieją pewne kompilatory, które nie wspierają lub źle wspierają tę klasę. Istnieje również różnica w interfejsach codecvt_byname na różnych kompilatorach.
  • Mój przykład pracy jest zaimplementowany z parametrem szablonu stanu kodeków. Zawsze używaj standardowego typu mbstate, ponieważ jest to jedyny sposób na użycie twojego kodeku ze standardowymi klasami iostream.
  • Typ std :: mbstate_t nie może być używany jako wskaźnik na platformach 64-bitowych w sposób międzyplatformowy.
  • bezpaństwowców konwersje pracować na krótkie ciągi znaków, ale może się nie powieść, jeśli starają się przekształcić większy kawałek dane streambuf wewnętrzny rozmiar bufora (UTF jest zasadniczo kodowanie Stateful)
+1

+1 - Nie wiedziałem, że istnieje 'codecvt_byname' i okazuje się, że mój kompilator faktycznie obsługuje takie rzeczy poprawnie. (Kto wiedział?) Nie akceptując tego jeszcze, ponieważ nie jest to bezpośrednia odpowiedź na pytanie, ale jeśli/kiedy wygasa nagroda, i tak otrzymasz punkty. –

4

Problem z tym std :: codecvt polega na szukaniu rozwiązania problemu. A raczej problem, który próbuje rozwiązać, jest nierozwiązywalny, więc każdy, kto próbuje go użyć jako rozwiązania, będzie bardzo rozczarowany.

Jeśli nie wiesz, który zestaw znaków to twoje wejście lub wyjście, to std :: codecvt nigdy nie będzie w stanie Ci pomóc. I odwrotnie, jeśli wiesz, z których zestawów znaków korzystasz, możesz łatwo przekonwertować je za pomocą pojedynczego wywołania funkcji. Zawijanie tego wywołania funkcji w skomplikowany bałagan szablonów nie zmienia tych podstaw.

... i dlatego nikt nie używa std :: codecvt. Polecam po prostu robić to, co wszyscy inni, i udawać, że nigdy się nie wydarzyło.

+2

Wiem dokładnie, jakiej strony kodowej i takich używam. Chcę być w stanie określić, która strona kodowa będzie używana dla iostreams. A jedyny sposób, aby to zrobić, to 'std :: codecvt'. Oczywiście, mogę przekonwertować blok tekstu pomiędzy stronami kodowymi bez problemu, ale nie ma sposobu, aby powiedzieć: "sformatuj tę liczbę całkowitą na szerokość 8 spacji, wypełnij puste pola zerami" bez dużego bałaganu 'std :: wstringstream' s.Wolałbym po prostu móc przekonwertować iostreams natywnie na poprawną stronę kodową, biorąc pod uwagę, że ma już taką możliwość. -1 za brak odpowiedzi na pytanie. –

+4

Co do "Nikt nie używa' std :: codecvt' ", czy możesz wyjaśnić, dlaczego dodano aspekty konwersji dla Unicode w C++ 0x i http://www.boost.org/doc/libs/1_43_0/libs/ serializacja/doc/codecvt.html? –

+2

Prawdopodobnie w nadziei, że ludzie zaczną * używać * std :: codecvt, gdy przestaną być bezużyteczne. – apenwarr