2010-08-14 12 views
8

Chciałbym napisać skrypt w języku Ruby, który zapisuje znaki japońskie na konsoli. Na przykład:Znaki Unicode w skrypcie Ruby?

puts "こんにちは・今日は" 

jednak uzyskać wyjątek podczas uruchamiania go:

jap.rb:1: Invalid char `\377' in expression 
jap.rb:1: Invalid char `\376' in expression 

jest to możliwe do zrobienia? Używam Ruby 1.8.6.

Odpowiedz

12

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.)

+3

to człowiek z Unicode w akcji – mykhal

Powiązane problemy