[#49480] [ANN] Milkode 1.1 — ongaeshi <ongaeshi0621@...>

おんがえし です。

13 messages 2013/07/02

[#49508] OSXでRUBY-TKインストール出来た方いますか? — Tsuyoshi Uema <mugenkai_151e@...>

7.8年ぶりの書き込みです。

12 messages 2013/07/29

[ruby-list:49489] Re: UTF-8 のスクリプト中で CP932 の正規表現オブジェクトが作りたい

From: "5.5" <5.5@...>
Date: 2013-07-07 06:52:36 UTC
List: ruby-list #49489
なかむら(う)さん,西山和広さん

5.5 です。助言により解決しました。ありがとうございました。
ご返事がとても遅くなってすみません。



他の方の参考になるかもしれないので,私が何で悩み,何を勘違いした
のか記してみます。

ことの発端は次のようなコードでした。(かなり省略してます)

# encoding: utf-8

re=""

何か.each do |str|
  re << str.encode("cp932")
end

regexp=Regexp.new(re)


これで出来た regexp を CP932 の文字列に使おうとしたときに,場合に
よって Encoding::CompatibilityError が出ることに悩まされました。

調べたところ,"ABC" とか "あいう" のようなものを与えると大丈夫なの
に,"\\p{Katakana}" などを与えると例外が出ていました。

このことと,いろいろ実験した結果から,Regexp.new にいろいろな文字列
オブジェクトを与えたときに出来る Regexp オブジェクトのエンコーディ
ングについて,以下のように考えました。

[A] CP932 の "あいう" を与える
 → CP932 の Regexp オブジェクト

[B] CP932,UTF-8 の "ABC" を与える
 → いずれも US-ASCII の Regexp オブジェクト

[C] CP932,UTF-8 の "\\p{Katakana}" を与える
 → スクリプトのエンコーディングと同じ Regexp オブジェクト

このうち [A] と [B] は正しく,[C] は勘違いでした。

なぜ勘違いしたかというと,上述のコードで,空文字列に CP932 の文字列
を concat したら当然 CP932 の文字列が出来るだろうと思い込んでいたか
らです。
実際は,UTF-8 の空文字列に CP932 の文字列を concat したとき,それが
ASCII 文字だけで出来ていれば UTF-8 のままなんですね。
※そもそも空文字列のエンコーディングに意味があるとすら思っていません
でした。

異なるエンコーディングの文字列を混ぜたときにどうなるかのルールはちょ
っとややこしいですね。ハマりどころです。

(13/07/01 16:08), U.Nakamura wrote:
> こんにちは、なかむら(う)です。
> 
> In message "[ruby-list:49476] UTF-8 のスクリプト中で CP932  の正規表現オブジェクトが作りたい"
>      on Jul.01,2013 15:48:43, <5.5@moji.gr.jp> wrote:
>> Regexp.#new の引数でエンコーディングを指定することもできません。
> 
> Regexp.new(str.encode('cp932'))
> 
> 
> それでは。
> 


-- 
5.5@moji.gr.jp

In This Thread

Prev Next