Wczytywanie Unicode z pliku

0

Witajcie,

Mam kilka pytań co do std::wfstream i std::fstream i ogólnie Unicode.

  1. Unicode używa tych samych znaków typu EOL (line feed, carriage return) co ASCII?
  2. Czy std::wfstream jest w stanie wczytać plik zakodowany w UTF-8 albo ASCII?
  3. if( !2 ) to jak rozpoznać kodowanie pliku, żeby wybrać odpowiednią klasę jeśli ASCII nie ma i UTF-8 nie musi mieć BOM?
  4. Czy std::wfstream używa UTF-16BE czy UTF-16LE (chyba, że z automatu czyta BOM i wybiera samo)?
  5. Czy std::fstream / std::wfstream działa z różnymi EOL? Chodzi o to czy program w C++ skompilowany pod Linuxem odczyta przez <fstream> plik zapisany pod Win, czy trzeba konwertować jakimś edytorem tekstu.
1
  1. Unicode używa tych samych znaków typu EOL (line feed, carriage return) co ASCII?

Tak. Są co prawda w standardzie Unicode oprócz CR i LF różne NEL (new line) i LS (line separator), ale nie występują w przyrodzie. :-)

Na pozostałe pytania odpowiedź brzmi "zależnie od systemu". Zwłaszcza obsługa UTF-8 pod Windows jest kulawa, preferowany jest UTF-16.

Znakiem nowej linii w C++ jest '\n', niezależnie od tego jak jest reprezentowany w pliku (CR, LF, CR+LF). Systemowa sekwencja nowej linii jest automatycznie zamieniana na '\n' i odwrotnie, jeśli plik otworzono w trybie tekstowym (i nie jest zamieniana jeżeli otworzono w trybie binarnym).

Ponieważ '\n' to to samo co LF, nie będzie pod Windowsem problemu z otwarciem pliku zarówno używającego LF ('\n' zostanie '\n') jak i CR+LF ("\r\n" w pliku będzie widziane jako '\n' w strumieniu).
Jednak próba zapisania '\n' do pliku tak naprawdę zapisze "\r\n", jeśli plik otwarto w trybie tekstowym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1