[#49838] rubyでfloat(32bit浮動小数点)の数値をHEX表示する手法は? — junichirou tahara <taharajunichirou@...>

jxtaharaと申します.

14 messages 2014/06/23
[#49840] Re: rubyでfloat(32bit浮動小数点)の数値をHEX表示する手法は? — EGUCHI Osamu <eguchi@...> 2014/06/23

えぐち@エスアンドイーです。

[#49842] Re: rubyでfloat(32bit浮動小数点)の数値をHEX表示する手法は? — Nobuyoshi Nakada <nobu@...> 2014/06/23

(2014/06/23 9:29), EGUCHI Osamu wrote:

[ruby-list:49855] Re: encoding of backtrace

From: OHARA Shigeki <os@...>
Date: 2014-06-29 12:45:19 UTC
List: ruby-list #49855
大原です。

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
Subject: [ruby-list:49853] Re: encoding of backtrace
Message-ID: <53AAE12D.4090106@ruby-lang.org>
Date: Wed, 25 Jun 2014 23:48:13 +0900

> > これを端末の encoding に合わせて出力する方法はあるでしょうか?
> 
> 今のところは対応していません。変換できない文字があった場合にさらに例外
> が発生してしまうのが悩ましいところです。

なるほど。現状は、敢えてそのまま出力している、ということでしょうか。

さらにコードなどを調べずに聞いてしまいますが、
これは仕組みとしてはどういうふうになっているのでしょうか?
$stderr を通る物は全て set_encoding の指定に従って
変換されると思っていたのですが (そこから勘違いしてるかもしれませんが) 、
backtrace は変換されないのは何故だろうという疑問です。

> ソースコードのエンコーディングは__ENCODING__で得られますが、String自体
> がエンコーディングを持っているので、internal encodingを指定する必要はあ
> りません。

なるほど。

あと、よく考えてみたら、
require した別のファイルの __ENCODING__ が異なっていれば破綻しますし、
そういう意味でも internal encoding の指定は要りませんね。

というわけで、こんな感じでいけました。

console_encoding = Encoding.locale_charmap
$stdout.set_encoding(console_encoding)
$stderr.set_encoding(console_encoding)
$stdin.set_encoding(console_encoding)


io.c を眺めていたら、
void rb_stdio_set_default_encoding(void) というのを見つけたので、
IO.stdio_set_encoding() があると便利なのかなと思いました。
もっとも、これでもせいぜい 3 行が 1 行になる程度ですが。

----
OHARA Shigeki (大原 重樹) <os@iij.ad.jp>

In This Thread