Mam problem z Ruby (1.9.3) i Powershell.STDIN i Powershell - w jaki sposób mogę dopasować kodowanie?
Potrzebuję napisać interaktywną aplikację konsolową, która zajmie się zdaniami w języku polskim. Pomagałem i mogę odzyskać elementy ARGV z polskimi znakami diakrytycznymi, ale standardowe wejście nie działa tak, jak chcę.
Kod ilustracji:
# encoding: UTF-8
target = ARGV[0].dup.force_encoding('CP1250').encode('UTF-8')
puts "string constant = dupą"
puts "dupą".bytes.to_a.to_s
puts "dupą".encoding
puts "target = " +target
puts target.bytes.to_a.to_s
puts target.encoding
puts target.eql? "dupą"
STDIN.set_encoding("CP1250", "UTF-8")
# the line above changes nothing, it can be removed and the result is still the same
# I obviously wanted to mimic the ARGV solution
target2 = STDIN.gets
puts "target2 = " +target2
puts target2.bytes.to_a.to_s
puts target2.encoding
puts target2.eql? "dupą"
Wyjście:
string constant = dupą
[100, 117, 112, 196, 133]
UTF-8
target = dupą
[100, 117, 112, 196, 133]
UTF-8
true
dupą //this is fed to STDIN.gets
target2 = dup
[100, 117, 112]
UTF-8
false
Najwyraźniej nigdy Ruby dostaje czwartą postać z STDIN.gets. Jeśli napiszę dłuższy ciąg znaków, np. dupąlalala
, w programie pojawią się tylko trzy początkowe bajty.
- Próbowałem wyliczanie bajty i zapętlenie z getc, ale nigdy nie wydają się dotrzeć Ruby (gdzie są one stracone?)
- Użyłem chcp 65001 (nie wydaje się, aby zmienić coś)
Zmieniono moje $ OutputEncoding na [Console] :: OutputEncoding; to teraz wygląda następująco:
IsSingleByte : True BodyName : ibm852 EncodingName : Środkowoeuropejski (DOS) HeaderName : ibm852 WebName : ibm852 WindowsCodePage : 1250 IsBrowserDisplay : True IsBrowserSave : True IsMailNewsDisplay : False IsMailNewsSave : False EncoderFallback : System.Text.InternalEncoderBestFitFallback DecoderFallback : System.Text.InternalDecoderBestFitFallback IsReadOnly : True CodePage : 852
używam czcionki Consolas
Co mogę zrobić, aby czytać polskich liter prawidłowo w PowerShell?
Czy działa po wywołaniu z cmd.exe firmy innej niż PowerShell? –
Wiem, że to pytanie jest bardzo stare, ale w każdym razie: to nie działało w zwykłym cmd.exe. Ten sam przykład (oczywiście z kodowaniem zmienionym) działa w Linuksie. Przebudowałem mój projekt, aby korzystać z plików zamiast standardowych danych wejściowych. –
Wiem, że to pytanie jest bardzo stare, ale w każdym razie: OTRZYMUJEMY ODPOWIEDŹ! ;) – Henrik