Plik został zapisany w kodowaniu UTF-16LE, którego system Windows błędnie nazywa "Unicode". Najlepiej unikać tego kodowania, ponieważ nie jest to nadzbiór ASCII: każda jednostka kodowa jest przechowywana jako dwa bajty, ze znakami ASCII o innym bajcie przechowywanym jako \0
. To zmyli strasznie dużo oprogramowania; nie jest niezwykłe używanie UTF-16 do przechowywania plików.
Co widzisz ze \377
i \376
(ósemkowej dla \xFF
i \xFE
) jest sekwencją U + FEFF Byte Order Mark umieścić w przedniej części UTF-16 pliki do odróżnienia UTF-16LE z UTF-16BE.
Ruby 1.8 jest całkowicie oparte na bajtach; nie próbuje odczytać znaków Unicode ze skryptu. Możesz więc zapisywać tylko pliki źródłowe w kodowaniach zgodnych z ASCII. Zwykle chcesz zapisać swoje pliki jako UTF-8 (bez LM-u, faux-BOM UTF-8 to kolejna świetna innowacja firmy Microsoft, która wszystko psuje). Byłoby to świetne rozwiązanie dla skryptów w Internecie tworzących strony UTF-8.
A jeśli chcesz mieć pewność, że kod źródłowy będzie tolerancyjny być zapisywane w dowolnym kodowaniu ASCII-kompatybilne, można zakodować ciąg aby uczynić go bardziej sprężysty (jeśli jest mniej czytelny):
puts "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe3\x83\xbb\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf"
Jednak! Napisanie na konsolę samo w sobie stanowi duży problem. Jakie kodowanie jest używane do wysyłania znaków na konsolę różni się w zależności od platformy. W systemie Linux lub OS X jest to kodowanie UTF-8. W systemie Windows jest to inne kodowanie dla wszystkich ustawień narodowych instalacji (wybrane w "Język dla aplikacji nie obsługujących kodu Unicode" w sekcji "Opcje regionalne i opcje językowe" w panelu sterowania), ale jest to nigdy UTF-8. To ustawienie jest znowu, zwodniczo znane jako strona kodowa ANSI.
Więc jeśli używasz japońskiej instalacji Windows, kodowanie konsoli będzie stroną kodową systemu Windows 932 (wariant Shift-JIS). Jeśli tak jest, możesz zapisać plik tekstowy z edytora tekstu za pomocą "ANSI" lub jawnie "Japanese cp932", a gdy uruchomisz go w Ruby, otrzymasz właściwe znaki. Ponownie, jeśli chcesz, aby źródło wytrzymać misencoding, można uciec znaków w kodowaniu cp932:
puts "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x81E\x8d\xa1\x93\xfa\x82\xcd"
Ale jeśli uruchomić go na komputerze w innej lokalizacji, będzie ona produkować różne znaki. Nie będziesz w stanie pisać japońskiego na domyślnej konsoli z Ruby na instalacji Western Windows (strona kodowa 1252).
(Podczas gdy Ruby 1.9 znacznie poprawia obsługę Unicode, nic tu nie zmienia.To nadal jest aplikacja oparta na bajtach, korzystająca z funkcji IO biblioteki standardowej C, co oznacza, że jest ograniczona do lokalnej strony kodowej systemu Windows.)
to człowiek z Unicode w akcji – mykhal