# S = '\\x80'; /#{s}/ raises an exception in US-ASCII script

**URL:** <https://www.ruby-forum.com/t/s-x80-s-raises-an-exception-in-us-ascii-script/232593>\
**Category:** Development\
**Created:** [October 17, 2014, 2:53am UTC](https://www.ruby-forum.com/t/s-x80-s-raises-an-exception-in-us-ascii-script/232593 "2014-10-17T02:53:20Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![addis\_a](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c4cdca/32.png) [@addis\_a](https://www.ruby-forum.com/u/addis_a)\
**Post date:** [October 17, 2014, 2:53am UTC](https://www.ruby-forum.com/t/s-x80-s-raises-an-exception-in-us-ascii-script/232593/1 "2014-10-17T02:53:20Z")

</div>

Issue #10382 has been updated by Akira T…

デフォルトのソースエンコーディングが UTF-8 になったことはこっちも仕様を変更する理由になるかもしれませんね。

* * *

Bug #10382: s = ‘\x80’; /#{s}/ raises an exception in US-ASCII script

> **[Bug #10382: s = '\\x80'; /#{s}/ raises an exception in US-ASCII script - Ruby...](https://bugs.ruby-lang.org/issues/10382#change-49503)**
>
> Redmine

- Author: Akira T.
- Status: Open
- Priority: Normal
- Assignee:
- Category:
- Target version:
- ruby -v: ruby 2.2.0dev (2014-10-14 trunk 47915) [x86\_64-linux]
- Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN

* * *

以下のふたつのスクリプトの動作は一致するべきだと思うのですが、  
前者と異なり後者は例外となります。

```auto
% cat z1.rb
# -*- encoding: US-ASCII -*-
r = /#{'\x80'}/
p [r, r.encoding]
% ./miniruby -v z1.rb
ruby 2.2.0dev (2014-10-14 trunk 47915) [x86_64-linux]
[/\x80/, #<Encoding:ASCII-8BIT>]

```

```auto
% cat z2.rb
# -*- encoding: US-ASCII -*-
s = '\x80'
r = /#{s}/
p [r, r.encoding]
% ./miniruby -v z2.rb
ruby 2.2.0dev (2014-10-14 trunk 47915) [x86_64-linux]
z2.rb:3:in `<main>': invalid multibyte escape (ArgumentError)

```

後者のスクリプトは前者のスクリプトの文字列 ‘\x80’ を変数に代入してから  
使っているだけの違いなので動作が変わる理由はないと思います。

ここでどちらが正しいかというのが問題ですが、前者が正しいのだと思います。

正規表現リテラルはスクリプトエンコーディングというのが原則で、  
それだけなら US-ASCII なので \x80 は invalid で例外という後者が正しいのですが、  
US-ASCII のスクリプト内で \x80 などを使うと自動的に ASCII-8BIT になるという仕様 ruby-dev:33348  
があって、  
動的な正規表現に対してこれが実装されていないように思います。

(静的な正規表現に関しての実装は reg\_fragment\_setenc\_gen だと思います。)
