2012-05-29 10 views
5

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?

+1

Czy działa po wywołaniu z cmd.exe firmy innej niż PowerShell? –

+0

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

+1

Wiem, że to pytanie jest bardzo stare, ale w każdym razie: OTRZYMUJEMY ODPOWIEDŹ! ;) – Henrik

Odpowiedz

1

Znalazłem kilka istotnych informacji. Nie jestem pewien, czy to dokładnie właściwa informacja. Ale, hej, OP ma już inne rozwiązanie.

# Get "encoding" for code page 1250 (Central European) 
$en=[System.Text.Encoding]::GetEncoding(1250) 
# Looks like this: 
IsSingleByte  : True 
BodyName   : iso-8859-2 
EncodingName  : Central European (Windows) 
HeaderName  : windows-1250 
WebName   : windows-1250 
WindowsCodePage : 1250 
IsBrowserDisplay : True 
IsBrowserSave  : True 
IsMailNewsDisplay : True 
IsMailNewsSave : True 
EncoderFallback : System.Text.InternalEncoderBestFitFallback 
DecoderFallback : System.Text.InternalDecoderBestFitFallback 
IsReadOnly  : True 
CodePage   : 1250 

# Change STDIN's input encoding 
[console]::InputEncoding=$en 
$x = Read-Host 
# I typed in dupą 
# (I set Polish in Languate Bar. 
# Final letter is apostrophe on US English keyboard) 
[int[]][char[]]$x 
# output is: 100 117 112 261 (in hex): 64 75 70 105 
# the final character (261) is "Latin Small Letter A with Ogonek" 
+0

Użyłem tej metody do przechwytywania bieżącego kodowania i zmiany go na 1250, ponieważ dane wyjściowe z Win32 NetDfsEnum zostają zmanipulowane w PowerShell, powinienem zauważyć, że te same dane pobierane z cmdletem Dfsn nie są dotknięte, ale są zbyt wolne dla moich celów . –

Powiązane problemy