Open3を使用してシェルコマンド(UTF-16を出力することが知られている)を呼び出すWindows上で実行されているRubyプログラムがあります。
attrs={}
attrs[:stdout], attrs[:stderr], status = Open3.capture3(command)
unless attrs[:stderr].nil?
begin
attrs[:stderr].force_encoding(Encoding::UTF_16LE).encode!(Encoding::UTF_8)
rescue => e
attrs[:stderr] = attrs[:stderr].bytes.to_json.encode!(Encoding::UTF_8)
end
end
UTF_16LE への force_encoding が機能せず、例外がスローされた場合、単純にバイトを保存し、JSON 文字列としてエンコードし、UTF_8 としてエンコードします。
まあ....例外がスローされ、レスキュー句でバイトの出力配列をキャッチしました。次のようになります。
[10,84,104,105,115,32,97,112,112,108,105,99,97,116,105,111,110,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,116,104,101,32,82,117,110,116,105,109,101,32,116,111,32,116,101,114,109,105,110,97,116,101,32,105,116,32,105,110,32,97,110,32,117,110,117,115,117,97,108,32,119,97,121,46,10,80,108,101,97,115,101,32,99,111,110,116,97,99,116,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,39,115,32,115,117,112,112,111,114,116,32,116,101,97,109,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10]
何らかの形式のテキストに戻すにはどうすればよいですか。例えば私がする場合:
irb> "dog".bytes
=> [100, 111, 103]
irb> "कुत्रा".bytes
=> [224, 164, 149, 224, 165, 129, 224, 164, 164, 224, 165, 141, 224, 164, 176, 224, 164, 190]
プログラムで [100, 111, 103] を「犬」または [224, 164, 149, 224, 165, 129, 224, 164, 164, 224, 165, 141, 224, 164, 176, 224, 164, 190] 戻る "カケラ" ? 私の出力バイト配列が何を意味するのかを理解する方法はありますか?
- - - - - - - - - - - - - アップデート - - - - - - - - - - - - ---
少し掘り下げましたが、「デコード」が問題ではないため、しばらく時間がかかりました。ただし、変数messageに保持した配列で次のことを行いました。
message.map{|c| c.chr}.join("")
=> "\nThis application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information.\n"
エラーメッセージがUTF-16LEではないという点で、私の問題は解決しました。
しかし、これを実行すると、次の結果が得られました。
irb> "कुत्रा".bytes.map{|c| c.chr}.join("")
=> "\xE0\xA4\x95\xE0\xA5\x81\xE0\xA4\xA4\xE0\xA5\x8D\xE0\xA4\xB0\xE0\xA4\xBE"
この奇妙に見える文字列またはバイト シーケンスをより意味のある "कुत्रा" に変換するにはどうすればよいですか?