2012-05-29 3 views
5

У меня проблема с Ruby (1.9.3) и Powershell.STDIN и Powershell - Как мне сделать кодировку?

Мне нужно написать интерактивное консольное приложение, которое будет касаться предложений на польском языке. Мне помогли и могут извлекать элементы ARGV с польскими диакритиками, но стандартный вход не работает так, как я хочу.

Код иллюстрации:

# 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ą" 

Выход:

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 

Видимо Руби никогда не получает четвертый персонаж из STDIN.gets. Если я напишу более длинную строку, например dupąlalala, все еще только три начальных байта появляются в программе.

  • Я попытался перечислить байты и перекручивание с GETC, но они никогда не достичь рубин (где они потеряли?)
  • Я использовал CHCP 65001 (не похоже, ничего менять)
  • Я изменил свой $ OutputEncoding на [Console] :: OutputEncoding; она теперь выглядит следующим образом:

    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 
    
  • Я использую шрифт Consolas

Что мне делать, чтобы читать польские диакритические правильно в Powershell?

+1

Работает ли он при вызове из файла cmd.exe, отличного от PowerShell? –

+0

Я знаю, что этот вопрос очень старый, но в любом случае: это не работает в простой cmd.exe. Тот же пример (с изменением кодировок, конечно) работает в Linux. Я перестроил свой проект для использования файлов вместо стандартного ввода. –

+1

Я знаю, что этот вопрос очень старый, но так или иначе: МЫ СПРОСИТЕ ОТВЕТ! ;) – Henrik

ответ

1

Я узнал некоторую релевантную информацию. Не уверен, что это именно то, что нужно. Но, эй, у ОП уже есть другое решение.

# 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

Я использовал этот метод для захвата текущей кодировки и изменения ее на 1250, потому что вывод из Win32 NetDfsEnum искажается в PowerShell, я должен отметить, что те же данные, полученные с помощью командлета Dfsn, не страдают, но слишком медленны для моих целей , –