[#32172] Re: eRuby のインストールに関して — "Tatsuaki Nagai" <Tatsuaki_Nagai@...>
永井@KCです。
[#32182] 汚染された文字列の eval — 堀川 久 <vzw00011@...>
こんにちは。
まつもと ゆきひろです
新井です。
こんにちは。
[#32185] (´ヘ`;)ハァ — "akira@..." <aan82580@...>
御晩で御座いますドモドモ\(^_^ ) ( ^_^)/ドモドモ
[#32205] assert and assert_equal — Masaki Suketa <masaki.suketa@...>
助田です。
あべです。
[#32216] ある文字列以外にマッチさせる正規表現 — "Tatsuaki Nagai" <Tatsuaki_Nagai@...>
こんにちは。永井@KCです。
[#32221] Re: ある文字列以外にマッチさせる正規表現 — "Tatsuaki Nagai" <Tatsuaki_Nagai@...>
永井@KCです。
[#32249] ActiveScriptRuby + rbnamazu (on windows) — keiichi matsunaga <ma2@...>
松永です。
松永です。
あおき@一週間メール見てなかったらカレー食べそこなったよ〜 です。
松永です。
大島です。
松永です。
松永です。
[#32254] Install ruby-1.6.5 on MacOSX10.1 — Ryotaro Arai <misty@...>
はじめまして、R.Araiといいます。
[#32263] fastcgi.rb and cgi.rb — 岡田 潤 <yun@...>
ゆんです。
前田です。
青山です。
高橋征義です。
青山です。
まつもと ゆきひろです
高橋征義です。
> うーん、あんまり文字列一般が備えるべき機能ではないと
高橋征義です。
> でも、128から255までの場合、ISO-8859-1を使っている人で、
まつもと ゆきひろです
In article <1005968249.366927.16199.nullmailer@ev.netlab.jp>,
[#32284] cgi/session.rb について — IKEBE Tomohiro <ikebe@...>
まつもと ゆきひろです
[#32291] how to use gdk_{pointer|keyboard}_{grab|ungrab}? — HOSONO Hidetomo <h@...>
細野と申します。
[#32310] Ruby SAX Library — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
なひです。
[#32319] ruby のソースを流用することについて — Kengonakajima <ringo@...>
こんにちは
[#32329] PalmOS for Ruby — Toru MITANI <toru_m@...2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
白川です。
From: "T.Shirakawa" <niegh@dk.catv.ne.jp>
まつもと ゆきひろです
まつもと ゆきひろです
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
こんばんわ、MoonWolfです。
In message <20011119230955.E9F7.TORU_M@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
At Thu, 22 Nov 2001 21:26:45 +0900,
From: shukaku@j-mac.co.jp
ほり@筑波大学といいます
From: "Masatake E. Hori" <eddie@luft.geo.tsukuba.ac.jp>
ほり@筑波大学です
白川です。 #話題に乗り遅れた?
From: "T.Shirakawa" <niegh@dk.catv.ne.jp>
白川です。
From: "T.Shirakawa" <niegh@dk.catv.ne.jp>
[#32405] [irb]%-statement bug? — rubikitch <rubikitch@...>
るびきちです。
[#32440] shibu-rug — KANDA Daisuke <MAP2303@...>
From: KANDA Daisuke <MAP2303@mapletown.net>
高橋征義です。
高橋征義です。
rubiben です。
前田です。
まつもと ゆきひろです
[#32465] Ruby for PalmOS に対する熱い想い — Toru MITANI <toru_m@...2.dion.ne.jp>
newです.
From: "Nibu, Mitsunori." <nyu@nk.rim.or.jp>
newです.
From: "丹生 光則 Nibu,Mitsunori." <nyu@nk.rim.or.jp>
newです.
From: "丹生 光則 Nibu,Mitsunori." <nibu@tec.osaka.jip.co.jp>
newです.
初めまして。オーストラリア在住のビクターと申します。ハンドルではなく本名です。(^^;)
わたなべです。
まつもと ゆきひろです
横から失礼します。
From: Hiroyuki KUROSAKI <noir@st.rim.or.jp>
From: Toru MITANI <toru_m@h2.dion.ne.jp>
At Wed, 28 Nov 2001 20:52:49 +0900,
rubiben 尾崎です。
昨年11月29日の[ruby-list:32609]で、下記のような投稿を書きました。
From: Nakamura Akifumi <BXQ04723@nifty.ne.jp>
From: Nakamura Akifumi <BXQ04723@nifty.ne.jp>
From: Nakamura Akifumi <BXQ04723@nifty.ne.jp>
newです.
[#32473] File.expand_path(" 一覧表 .xsl") — Take_tk <ggb03124@...>
File.expand_path で「表」の文字が化けたのですが、最新版ではOKでしょう
まつもと ゆきひろです
たけ(tk)です。
[#32486] FormDesigner について — Nagai T <idonagai@...>
はじめまして、Tnagaiと申します。
[#32515] 拡張された日本語処理 — rubikitch <rubikitch@...>
るびきちです。
高橋征義です。
[#32551] ソースの readme をもう少し詳しく — "Mitsuo Igarashi" <mitsu5@...>
ソース中のREADMEをもう少し説明を詳しくしていただければ、
五十嵐です。
[#32552] RubyCocoa 0.1.0 — FUJIMOTO Hisakuni <hisa@...>
藤本です、こんにちは。
[#32578] cygwin database Ruby Install MySQL PostgreSQL other... MS-Access(blase) — "Inoue" <inoue@...>
井上です。
井上です。
井上です。
なかだです。
とみたです。
[#32612] Ruby/MySQL Cygwin 環境での構築 (Re: cygwin database Ruby Install MySQL ...) — tamra@...
[#32632] Re: Ruby for PalmOS に対する熱い想い — Nagai T <idonagai@...>
原です。
こんにちは、なかむら(う)です。
すぎむし%Rubyちゃんポータルも見直ししないと…
From: maili31s@clio.ne.jp (SugHimsi == SUGIHARA Hiroshi)
原です。
なかだです。
あおきです。
渡辺哲也です。
なかだです。
[#32673] RubyCocoa 0.1.1 — FUJIMOTO Hisakuni <hisa@...>
藤本です、こんにちは。
[#32674] しぶらぐ議事録 — rubiben <ozaki@...>
[ruby-list:32180] Re: [ANN] WString 0.0.1
> 小澤といいます。よろしくお願いします。 酒井といいます。 # 日記で「codecvt_byname使うと良いかも」とか書いた者です。> 小澤さん > C++でワイド文字列ライブラリを書いてみました。文字列をバイト単位ではなく、 > 文字単位で扱うことができます。 (snip) > インストールが面倒ですが、感想や動作報告等いただけるとうれしいです。 正規表現の方は試していませんが、 結構良い感じだと思います。 どうせなので、オブジェクトにlocale名を持たせることで、 複数のlocaleを同時に扱えるようにするパッチを作ってみました。 メモ * 御指摘のようにlocaleヘッダが無い環境が多そうなので、setlocaleで頑張りました * C++は書き慣れていないので僕のコードは変かも * 正規表現の方には手が回ってません * localeが異なるオブジェクト間の演算はどうすべき? * wchar_tの表現がlocale依存に依存するBSD等の環境でのテストが必要そう… それと、struct WStringStruct に struct RBasic を持たせていますが、 Data_Make_Structで作ったオブジェクトはstruct RDataでデータを持っているので、 ここでは不要のはずです。 -- 酒井 政裕 / Masahiro Sakai e-mail: s01397ms@sfc.keio.ac.jp, zvm01052@nifty.ne.jp
Attachments (1)
diff -u wstring-0.0.1.orig/wstring/detail.hpp wstring-0.0.1/wstring/detail.hpp
--- wstring-0.0.1.orig/wstring/detail.hpp Thu Oct 25 00:19:16 2001
+++ wstring-0.0.1/wstring/detail.hpp Sat Nov 3 20:08:21 2001
@@ -15,6 +15,8 @@
#define __USE_ISOC99
#include <wchar.h>
+#include "utility.hpp"
+
// -----------------------------------------------------------------------------
namespace detail {
@@ -163,6 +165,7 @@
inline
VALUE change_case(VALUE rb_wstring, const T& func)
{
+ utility::SetLocale l(LC_CTYPE, get_wstring_locale(rb_wstring));
std::wstring* wstring = get_wstring(rb_wstring);
bool modified = false;
transform(wstring->begin(), wstring->end(), wstring->begin(), func, modified);
Common subdirectories: wstring-0.0.1.orig/wstring/test and wstring-0.0.1/wstring/test
diff -u wstring-0.0.1.orig/wstring/utility.hpp wstring-0.0.1/wstring/utility.hpp
--- wstring-0.0.1.orig/wstring/utility.hpp Thu Oct 25 00:19:16 2001
+++ wstring-0.0.1/wstring/utility.hpp Sat Nov 3 00:55:11 2001
@@ -20,6 +20,26 @@
namespace utility {
+class SetLocale {
+private:
+ int category;
+ char* old_locale;
+public:
+ SetLocale(int c, const char* locale): category(c)
+ {
+ old_locale = strdup(setlocale(category, NULL));
+ if (!setlocale(category, locale))
+ rb_raise(WStringError, "setlocale(%d, \"%s\") failed",
+ category, locale);
+ }
+
+ ~SetLocale(){
+ setlocale(category, old_locale);
+ free(old_locale);
+ }
+};
+
+
inline void call_setlocale(const char* locale)
{
if (setlocale(LC_CTYPE, locale) == 0)
diff -u wstring-0.0.1.orig/wstring/wstring.cpp wstring-0.0.1/wstring/wstring.cpp
--- wstring-0.0.1.orig/wstring/wstring.cpp Thu Oct 25 00:19:16 2001
+++ wstring-0.0.1/wstring/wstring.cpp Sat Nov 3 20:07:22 2001
@@ -37,6 +37,7 @@
void ws_delete(WStringStruct* wss)
{
delete wss->wstring;
+ free(wss->locale);
free(wss);
}
@@ -63,6 +64,21 @@
wss->wstring = wstring;
}
+const char* get_wstring_locale(VALUE rb_wstring)
+{
+ WStringStruct* wss;
+ Data_Get_Struct(rb_wstring, WStringStruct, wss);
+ return wss->locale;
+}
+
+void set_wstring_locale(VALUE rb_wstring, const char* locale)
+{
+ WStringStruct* wss;
+ Data_Get_Struct(rb_wstring, WStringStruct, wss);
+ free(wss->locale);
+ wss->locale = strdup(locale);
+}
+
VALUE make_wstring(const wchar_t* wc_str)
{
VALUE rb_wstring = make_wstring();
@@ -100,12 +116,14 @@
Check_Type(argv[0], T_STRING);
- if (argc == 1)
- utility::call_setlocale("");
- else if (argc == 2)
- utility::call_setlocale(STR2CSTR(argv[1]));
-
- return make_wstring(RSTRING(argv[0])->ptr);
+ char* locale = "";
+ if (argc == 2)
+ locale = STR2CSTR(argv[1]);
+
+ utility::SetLocale l(LC_CTYPE, locale);
+ VALUE rb_wstring = make_wstring(RSTRING(argv[0])->ptr);
+ set_wstring_locale(rb_wstring, setlocale(LC_CTYPE, NULL));
+ return rb_wstring;
}
VALUE ws_bracket_aux(VALUE self_, VALUE index_)
@@ -118,7 +136,9 @@
index = self->size() + index;
if (index < 0 || self->size() <= index)
return Qnil;
- return make_wstring((*self)[index]);
+ VALUE result = make_wstring((*self)[index]);
+ set_wstring_locale(result, get_wstring_locale(self_));
+ return result;
} else if (CLASS_OF(index_) == WString) {
const std::wstring* index = get_wstring(index_);
if (*index == L"")
@@ -133,6 +153,7 @@
if (rb_wmatch == Qnil) return Qnil;
VALUE rb_wstring = make_wstring();
set_wstring(rb_wstring, get_match_data(rb_wmatch)->str());
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
return rb_wstring;
#endif // WSTRING_NO_WREGEXP
} else {
@@ -146,6 +167,7 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring(*self, begin, length);
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
return rb_wstring;
}
}
@@ -173,6 +195,7 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring(*self, begin, length);
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
return rb_wstring;
} else if (argc ==1) {
return ws_bracket_aux(self_, argv[0]);
@@ -260,18 +283,21 @@
VALUE ws_to_s(VALUE self)
{
+ utility::SetLocale l(LC_CTYPE, get_wstring_locale(self));
const wchar_t* wc_str = get_wstring(self)->c_str();
return detail::make_string(wc_str);
}
VALUE ws_to_i(VALUE self)
{
+ utility::SetLocale l(LC_CTYPE, get_wstring_locale(self));
const wchar_t* wc_str = get_wstring(self)->c_str();
return rb_cstr2inum(detail::wcs_to_mbs(wc_str), 10);
}
VALUE ws_to_f(VALUE self)
{
+ utility::SetLocale(LC_CTYPE, get_wstring_locale(self));
const wchar_t* wc_str = get_wstring(self)->c_str();
const double f = wcstod(wc_str, 0);
return rb_float_new(f);
@@ -306,6 +332,7 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring();
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
const std::wstring* self = get_wstring(self_);
wstring->append(L"L\"");
@@ -362,6 +389,7 @@
VALUE ws_capitalize(VALUE self_)
{
+ utility::SetLocale l(LC_CTYPE, get_wstring_locale(self_));
std::wstring* self = get_wstring(self_);
bool modified = false;
detail::capitalize(self->begin(), self->end(), self->begin(), modified);
@@ -384,6 +412,7 @@
VALUE rb_string = make_wstring();
std::wstring* wstring = new std::wstring(*get_wstring(self_));
set_wstring(rb_string, wstring);
+ set_wstring_locale(rb_string, get_wstring_locale(self_));
RBASIC(rb_string)->klass = klass;
return rb_string;
@@ -391,6 +420,7 @@
VALUE ws_cmp(VALUE self, VALUE other)
{
+ utility::SetLocale l(LC_CTYPE | LC_COLLATE, get_wstring_locale(self));
utility::must_be_wstring(other);
return INT2FIX(get_wstring(self)->compare(*get_wstring(other)));
}
@@ -401,6 +431,7 @@
VALUE rb_string = make_wstring();
std::wstring* wstring = new std::wstring(*get_wstring(self));
set_wstring(rb_string, wstring);
+ set_wstring_locale(rb_string, get_wstring_locale(self));
wstring->append(*get_wstring(other));
return rb_string;
}
@@ -411,6 +442,7 @@
if (length == 0) {
VALUE rb_wstring = make_wstring();
set_wstring(rb_wstring, new std::wstring());
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
return rb_wstring;
}
@@ -424,6 +456,7 @@
VALUE rb_string = make_wstring();
std::wstring* wstring = new std::wstring();
set_wstring(rb_string, wstring);
+ set_wstring_locale(rb_string, get_wstring_locale(self_));
for (int i = 0; i < length; i++)
wstring->append(*self);
@@ -476,6 +509,7 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring(*self, from, length);
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
rb_yield(rb_wstring);
}
@@ -485,18 +519,37 @@
VALUE ws_each_char(VALUE self_)
{
const std::wstring* self = get_wstring(self_);
- for (size_t i = 0; i < self->size(); i++)
- rb_yield(make_wstring((*self)[i]));
+ for (size_t i = 0; i < self->size(); i++){
+ VALUE wstring = make_wstring((*self)[i]);
+ set_wstring_locale(wstring, get_wstring_locale(self_));
+ rb_yield(wstring);
+ }
return self_;
}
-VALUE ws_locale(VALUE)
+VALUE ws_locale(VALUE self)
{
- return rb_str_new2(setlocale(LC_CTYPE, 0));
+ return get_wstring_locale(self) ? rb_str_new2(get_wstring_locale(self)) : Qnil;
}
+// XXX
+#if 0
+#if defined(__STDC_ISO_10646__) || defined(_WIN32) || defined(_S1GLOBAL_H_)
+#define LOCALE_INDEPENDENT_WCHAR_T
+#endif
+#endif
+
+#ifdef LOCALE_INDEPENDENT_WCHAR_T
+VALUE ws_setlocale(VALUE self, VALUE locale)
+{
+ set_wstring_locale(self, STR2CSTR(locale));
+ return locale;
+}
+#endif
+
VALUE ws_hex(VALUE self)
{
+ utility::SetLocale l(LC_CTYPE, get_wstring_locale(self));
const wchar_t* wc_str = get_wstring(self)->c_str();
return rb_cstr2inum(detail::wcs_to_mbs(wc_str), 16);
}
@@ -513,6 +566,7 @@
else if (wc == L'b' || wc == 'B')
base = 2;
}
+ utility::SetLocale l(LC_CTYPE, get_wstring_locale(self));
return rb_cstr2inum(detail::wcs_to_mbs(wstring->c_str()), base);
}
@@ -734,6 +788,7 @@
return rb_funcall(ws_to_s(self), rb_intern("intern"), 0);
}
+// XXX: wcswidth?
VALUE ws_center(VALUE self_, VALUE width_)
{
const int width = NUM2INT(width_);
@@ -745,12 +800,14 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring();
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
wstring->append(space_width / 2, L' ');
wstring->append(*self);
wstring->append(space_width - space_width / 2, L' ');
return rb_wstring;
}
+// XXX: wcswidth?
VALUE ws_ljust(VALUE self_, VALUE width_)
{
const int width = NUM2INT(width_);
@@ -762,12 +819,14 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring();
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
wstring->append(*self);
wstring->append(space_width, L' ');
return rb_wstring;
}
+// XXX: wcswidth?
VALUE ws_rjust(VALUE self_, VALUE width_)
{
const int width = NUM2INT(width_);
@@ -779,6 +838,7 @@
VALUE rb_wstring = make_wstring();
std::wstring* wstring = new std::wstring();
set_wstring(rb_wstring, wstring);
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
wstring->append(space_width, L' ');
wstring->append(*self);
@@ -984,7 +1044,10 @@
VALUE rb_new_wstring = make_wstring();
std::wstring* new_wstring = new std::wstring();
set_wstring(rb_new_wstring, new_wstring);
+ set_wstring_locale(rb_new_string, get_wstring_locale(self_));
+ utility::SetLocale l(LC_CTYPE, locale);
+
ws_gsub_aux_aux(vector, self, new_wstring, replace, block_given);
if (ret == 0) {
@@ -1030,6 +1093,7 @@
if (block_given) {
VALUE rb_wstring = make_wstring();
set_wstring(rb_wstring, match->str());
+ set_wstring_locale(rb_wstring, get_wstring_locale(self_));
gc_ref = rb_yield(rb_wstring);
utility::must_be_wstring(gc_ref);
expanded = get_wstring(gc_ref);
@@ -1369,6 +1433,9 @@
rb_define_method(WString, "slice!", WS_CAST_FUNC(ws_slice), -1);
rb_define_method(WString, "locale", WS_CAST_FUNC(ws_locale), 0);
+#ifdef LOCALE_INDEPENDENT_WCHAR_T
+ rb_define_method(WString, "locale=", WS_CAST_FUNC(ws_setlocale), 1);
+#endif
#ifndef WSTRING_NO_WREGEXP
rb_define_method(WString, "=~", WS_CAST_FUNC(ws_match_equal), 1);
diff -u wstring-0.0.1.orig/wstring/wstring.hpp wstring-0.0.1/wstring/wstring.hpp
--- wstring-0.0.1.orig/wstring/wstring.hpp Thu Oct 25 00:19:16 2001
+++ wstring-0.0.1/wstring/wstring.hpp Sat Nov 3 19:49:17 2001
@@ -16,7 +16,7 @@
struct WStringStruct {
std::wstring* wstring;
- struct RBasic basic;
+ char* locale;
};
VALUE ws_dup(VALUE self);
@@ -28,5 +28,7 @@
VALUE make_wstring();
std::wstring* get_wstring(VALUE rb_wstring);
void set_wstring(VALUE rb_wstring, std::wstring* wstring);
+const char* get_wstring_locale(VALUE rb_wstring);
+void set_wstring_locale(VALUE rb_wstring, const char* locale);
#endif // WSTRING_WSTRING_HPP