[#34909] Kernel#evalの第2引数 — KURODA Hiraku <hiraku@...>
こんにちは、黒田ひらくと申します。
[#34911] erb still treats $KCODE — "Yusuke ENDOH" <mame@...>
遠藤です。
咳といいます。
まつもと ゆきひろです
永井@知能.九工大です.
[#34923] open() and encodings — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
永井@知能.九工大です.
こんにちは、なかむら(う)です。
In article <4847146F.4020103@airemix.jp>,
永井@知能.九工大です.
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#34938] Ruby1.8.7 で Rails2.0.2 が動かない — okkez <okkez000@...>
okkez です。
[#34979] [Bug:ruby 1.9] cannot open file with big mode value — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#34990] [Bug:1.9] Rational("355/113") clear $& — Tanaka Akira <akr@...>
以下のように、Rational("355/113") とすると $& が nil になり
> 以下のように、Rational("355/113") とすると $& が nil になり
ワナベと申します。
[#34997] Re: [ruby-changes:5517] Ruby:r17021 (trunk): * vm_insnhelper.c, vm.c, proc.c (proc_call): allow call method with — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
遠藤です。
まつもと ゆきひろです
遠藤です。
まつもと ゆきひろです
遠藤です。
ささだです.
ささだです.
まつもと ゆきひろです
ささだです.
[#35016] リリースプラン:1.9.0-2 — SASADA Koichi <ko1@...>
ささだです.
ささだです.
[#35020] Ruby 1.8.7-p17 has been released — "Akinori MUSHA" <knu@...>
Ruby 1.8.7-p17 をリリースしました。
pegacorn です。
[#35034] Array#shuffle! returns nil ? — okkez <okkez000@...>
okkez です。
[#35044] deadlock detection for 1.9 — "Yusuke ENDOH" <mame@...>
遠藤です。
こんばんは sheepman です。
まつもと ゆきひろです
[#35054] SSE2版 strlen — "NARUSE, Yui" <naruse@...>
成瀬です。
In message <485000F3.2010302@airemix.jp>
[#35056] Wide Finder performance — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
ささだです.
[#35074] [Bug:1.9] irb fg — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#35108] Re: [ruby-list:44988] Re: 各ブランチの計画 — Urabe Shyouhei <shyouhei@...>
卜部です。
こんにちは、なかむら(う)です。
[#35131] /\p{Hiragana}/s may dump core when sizeof(int) differs from sizeof(long) — "Yusuke ENDOH" <mame@...>
遠藤です。
[#35133] [BUG] class variable — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
[#35141] Etc::Passwd, Etc::Group というクラスは存在しない — okkez <okkez000@...>
okkez です。
[#35148] [Feature:trunk] IO#binmode? — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#35152] PATCH for MySQL/Ruby — Nobuyoshi Nakada <nobu@...>
なかだです。
[#35158] Etc.passwd{} のなかでのEtc.getpwnamの呼び出しがループします。 — "Yutaka Kanemoto" <kinpoco@...>
金本と申します。
[#35165] return from proc — SASADA Koichi <ko1@...>
ささだです.
[#35194] IncompatibleEncodingError — Kouhei Sutou <kou@...>
須藤です。
成瀬です。
須藤です。
[#35200] Win32 Unicode console output — Tietew <tietew@...>
Tietew です。
成瀬です。
artonです。
成瀬です。
成瀬です。
こんにちは、なかむら(う)です。
[#35226] [PATCH] freeze required_paths in gem_prelude.rb — "Keita Yamaguchi" <keita.yamaguchi@...>
山口と申します。
遠藤です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
[#35227] [Bug:trunk] Re: [ruby-cvs:24798] Ruby:r17573 (trunk): * parse.y (primary): make functional-style not operator to act — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#35247] Re: [ruby-list:45128] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Urabe Shyouhei <shyouhei@...>
卜部です。-devに振ります。ひょっとしてこんなパッチでSEGVのほうはおさまっ
まつもと ゆきひろです
前田です。
まつもと ゆきひろです
前田です。
卜部です。
[#35272] some insns should be method? — SASADA Koichi <ko1@...>
ささだです.
[#35273] $SAFEの今後 — Urabe Shyouhei <shyouhei@...>
〜これまでのあらすじ〜
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
前田です。
山口と申します。
[#35274] [Feature:trunk] test-coverage measurement — "Yusuke ENDOH" <mame@...>
遠藤です。
まつもと ゆきひろです
[#35278] [BUG] test_win32ole_event.rb in trunk — Masaki Suketa <masaki.suketa@...>
助田です。
こんにちは、なかむら(う)です。
artonです。
助田です。
artonです
助田です。
[ruby-dev:34931] Re: open() and encodings
成瀬です。
Yukihiro Matsumoto wrote:
> まつもと ゆきひろです
>
> In message "Re: [ruby-dev:34923] open() and encodings"
> on Wed, 4 Jun 2008 08:08:54 +0900, "NARUSE, Yui" <naruse@airemix.jp> writes:
>
> |Dir.open/entries に関連して、open() 絡みの変更案です。
> |
> |まず、ファイルパスについて、現在はファイルシステムのエンコーディングに関らず、
> |与えられたバイナリ列をそのままOSに渡していますが、
> |ファイルシステムのエンコーディングに変換した上で渡した方が親切でしょう。
>
> 「ファイルシステムのエンコーディング」って変換して渡せるほど
> 信頼できるものなんでしょうか。変換ってのは間違ってると致命的
> ですから。
変換で間違えて読めないのは、実際はそこまで致命的ではないと思うのです。
そのようなケースではどのみちどこかで変換したであろうはずで、
この場合どこで変換しても注意深くしないと読めないものは読めないわけです。
ならば、読めるものは楽に読めた方がいいであろうと。
どちらかといえば気にしていたのは読めてはならないものを読めてしまう場合でしたが、
こちらも結局変換が必要な場合における脅威は増減しないであろうという見解です。
> WindowsやOSXではそうなのかもしれませんが、UNIXではかならずし
> もそうでもないような。このパッチではlocaleを採用しているよう
> ですが、ひとつのファイルシステムで複数のエンコーディングが混
> 在している場合もありますから、明示的にエンコーディングが指定
> できないとまずいです。というか、むしろ最初から変換してほしく
> ありません。
こちらはUNIXにおけるデフォルトがlocaleでは適切とは言えない、
ということでしょうか。
確かに、RedHat系ですと事実上UTF-8がファイルシステムのエンコーディングと言える
であろう一方で(正確には/etc/sysconfig/i18nで指定)、
Debianや*BSDではシステム全体のエンコーディングはおそらく決定できません。
と、すると、デフォルトは ASCII-8BIT あたりにして変換しない方がいいのですかねぇ。
> |次に、現在open()はエンコーディングを別にオプションで取ることができません。
> |これも
> |open("filename", internal_encoding:"EUC-JP", external_encoding:"Shift_JIS")
> |などと取れたほうが便利ではないでしょうか。
> |なお、キー名はとりあえずそのまんま長めの名前にしています。
> |これならば誤解はないであろうし、後でもっと良い名前を思いついたときに変えやすいと思ったので。
>
> えーと、IO.readなどの類推からいえば、まず
>
> open("filename", encoding: "EUC-JP:Shift_JIS")
>
> の導入が先だろうと思います。で、internal_encodingなどに反対
> するわけではありませんが、その場合にはopen_key_argsも同じオ
> プションを受け付けるべきでしょうね。
なるほど。
そのように変更してみました。
--
NARUSE, Yui <naruse@airemix.jp>
Attachments (1)
--- encoding.c (revision 16821)
+++ encoding.c (working copy)
@@ -964,6 +964,23 @@ rb_locale_encoding(void)
return rb_enc_from_index(idx);
}
+rb_encoding *
+rb_filesystem_encoding(void)
+{
+ static rb_encoding *enc;
+ if (!enc) {
+#if defined __APPLE__
+ enc = rb_enc_find("UTF8-MAC");
+#elif defined _WIN32
+ /* sitll use ANSI encoding */
+ enc = rb_locale_encoding();
+#else
+ enc = rb_ascii8bit_encoding();
+#endif
+ }
+ return enc;
+}
+
static int default_external_index;
rb_encoding *
--- include/ruby/encoding.h (revision 16821)
+++ include/ruby/encoding.h (working copy)
@@ -169,6 +169,7 @@ rb_encoding *rb_ascii8bit_encoding(void)
rb_encoding *rb_utf8_encoding(void);
rb_encoding *rb_usascii_encoding(void);
rb_encoding *rb_locale_encoding(void);
+rb_encoding *rb_filesystem_encoding(void);
rb_encoding *rb_default_external_encoding(void);
int rb_usascii_encindex(void);
int rb_ascii8bit_encindex(void);
--- io.c (revision 16821)
+++ io.c (working copy)
@@ -125,6 +125,7 @@ VALUE rb_default_rs;
static VALUE argf;
static ID id_write, id_read, id_getc, id_flush, id_encode, id_readpartial;
+static VALUE sym_mode, sym_perm, sym_extenc, sym_intenc, sym_encoding, sym_open_args;
struct timeval rb_time_interval(VALUE);
@@ -4015,11 +4016,31 @@ rb_io_s_popen(int argc, VALUE *argv, VAL
static VALUE
rb_open_file(int argc, VALUE *argv, VALUE io)
{
- VALUE fname, vmode, perm;
+ VALUE opt, fname, vmode, perm, encoding=Qnil, extenc=Qnil, intenc=Qnil;
const char *mode;
int flags, fmode;
+ rb_encoding *fname_enc;
+ rb_io_t *fptr;
+
+ opt = rb_check_convert_type(argv[argc-1], T_HASH, "Hash", "to_hash");
+ if (!NIL_P(opt)) {
+ VALUE v;
+ v = rb_hash_aref(opt, sym_mode);
+ if (!NIL_P(v)) vmode = v;
+ v = rb_hash_aref(opt, sym_perm);
+ if (!NIL_P(v)) perm = v;
+ argc -= 1;
+ }
rb_scan_args(argc, argv, "12", &fname, &vmode, &perm);
+ fname_enc = rb_enc_get(fname);
+ if (rb_usascii_encoding() == fname_enc
+ || rb_ascii8bit_encoding() == fname_enc
+ || rb_filesystem_encoding() == fname_enc) {
+ }
+ else {
+ fname = rb_str_transcode(fname, rb_enc_from_encoding(rb_filesystem_encoding()));
+ }
FilePathValue(fname);
if (FIXNUM_P(vmode) || !NIL_P(perm)) {
@@ -4035,10 +4056,23 @@ rb_open_file(int argc, VALUE *argv, VALU
rb_file_sysopen_internal(io, RSTRING_PTR(fname), flags, fmode);
}
else {
-
mode = NIL_P(vmode) ? "r" : StringValueCStr(vmode);
rb_file_open_internal(io, RSTRING_PTR(fname), mode);
}
+
+ GetOpenFile(io, fptr);
+ if (!NIL_P(opt)) {
+ VALUE v = rb_hash_aref(opt, sym_encoding);
+ if (!NIL_P(v)) {
+ mode_enc(fptr, StringValueCStr(v));
+ }
+ else {
+ v = rb_hash_aref(opt, sym_extenc);
+ if (!NIL_P(v)) fptr->enc = rb_to_encoding(v);
+ v = rb_hash_aref(opt, sym_intenc);
+ if (!NIL_P(v)) fptr->enc2 = rb_to_encoding(v);
+ }
+ }
return io;
}
@@ -6145,7 +6179,7 @@ static void
open_key_args(int argc, VALUE *argv, struct foreach_arg *arg)
{
VALUE opt, v;
- static VALUE encoding, mode, open_args;
+ rb_io_t *fptr;
FilePathValue(argv[0]);
arg->io = 0;
@@ -6160,17 +6194,8 @@ open_key_args(int argc, VALUE *argv, str
if (NIL_P(opt)) goto no_key;
if (argc > 2) arg->argc = 1;
else arg->argc = 0;
- if (!encoding) {
- ID id;
- id = rb_intern("encoding");
- encoding = ID2SYM(id);
- id = rb_intern("mode");
- mode = ID2SYM(id);
- id = rb_intern("open_args");
- open_args = ID2SYM(id);
- }
- v = rb_hash_aref(opt, open_args);
+ v = rb_hash_aref(opt, sym_open_args);
if (!NIL_P(v)) {
VALUE args;
@@ -6183,7 +6208,7 @@ open_key_args(int argc, VALUE *argv, str
arg->io = rb_io_open_with_args(RARRAY_LEN(args), RARRAY_PTR(args));
return;
}
- v = rb_hash_aref(opt, mode);
+ v = rb_hash_aref(opt, sym_mode);
if (!NIL_P(v)) {
arg->io = rb_io_open(RSTRING_PTR(argv[0]), StringValueCStr(v));
}
@@ -6191,12 +6216,17 @@ open_key_args(int argc, VALUE *argv, str
arg->io = rb_io_open(RSTRING_PTR(argv[0]), "r");
}
- v = rb_hash_aref(opt, encoding);
+ GetOpenFile(arg->io, fptr);
+ v = rb_hash_aref(opt, sym_encoding);
if (!NIL_P(v)) {
- rb_io_t *fptr;
- GetOpenFile(arg->io, fptr);
mode_enc(fptr, StringValueCStr(v));
}
+ else {
+ v = rb_hash_aref(opt, sym_extenc);
+ if (!NIL_P(v)) fptr->enc = rb_to_encoding(v);
+ v = rb_hash_aref(opt, sym_intenc);
+ if (!NIL_P(v)) fptr->enc2 = rb_to_encoding(v);
+ }
}
static VALUE
@@ -7740,4 +7770,11 @@ Init_IO(void)
#ifdef O_SYNC
rb_file_const("SYNC", INT2FIX(O_SYNC));
#endif
+
+ sym_mode = ID2SYM(rb_intern("mode"));
+ sym_perm = ID2SYM(rb_intern("perm"));
+ sym_extenc = ID2SYM(rb_intern("external_encoding"));
+ sym_intenc = ID2SYM(rb_intern("internal_encoding"));
+ sym_encoding = ID2SYM(rb_intern("encoding"));
+ sym_open_args = ID2SYM(rb_intern("open_args"));
}