2012-12-19 16 views
5

Mam problem z ciągami znaków wielobajtowych. Mam uproszczone mój problem jak poniżej:wyjściowy ciąg wielobajtowy w C++

std::wstring str = L"multıbyte test string"; 
std::wofstream f; 
f.open("F:\\dump.txt"); 
f << str; 
f.close(); 

i zawartości pliku zrzutu jest: „mult”

Dlaczego tnie pozostałą część ul altough Użyłem wstring i wofstream?

Dzięki

+1

Kilka pytań: Jak duży jest twój system operacyjny, który zawiera plik zrzutu? W jaki sposób sprawdziłeś zawartość pliku zrzutu? –

+0

Czy znak "ı" w "multibanie" może spowodować jakiś problem? – iikkoo

Odpowiedz

1

wofstream pisze się dane przy użyciu bieżących ustawień regionalnych. Domyślne ustawienia regionalne prawdopodobnie nie obsługują znaków wielobajtowych.

patrz pytanie: Unable to write a std::wstring into wofstream

można zmusić go do wyjścia przez cały ciąg:

std::locale::global(std::locale("")); 

przed piśmie, jednak nie dostaniesz znaki Unicode w systemie Windows, ponieważ nie robi” t obsługuj locale UTF-8 natywnie.

Aby to zrobić, należy przekonwertować go na std :: string przy użyciu WideCharToMultiByte i napisać go za pomocą zwykłego ofstream.

0

Będziesz musiał przesłać strumień wyjściowy z niektórymi ustawieniami regionalnymi, aby uzyskać pewną sensowną odmianę codecvt do wykonania konwersji wchar_t na char. Jeśli masz C++ 11 wspierającą kompilatora lub Visual Studio 2010 i później, można użyć UTF-8 aspekt (codecvt_utf8):

f.imbue(
    std::locale (  // using std::locale constructed from 
     std::locale(), // global locale 
          // and codecvt_utf8 facet 
      new std::codecvt_utf8<char, 0x10FFFF, 
       static_cast<std::codecvt_mode>(std::consume_header 
        | std::little_endian)>); 

Istnieje również codecvt_utf16.