https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1709775478
2014-01-14T08:45:20Z
Ruby Issue Tracking System
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=44279
2014-01-14T08:45:20Z
ganaware (Nayuta Taga)
<ul></ul><p>チケット <a class="issue tracker-1 status-1 priority-4 priority-default" title="Bug: Cygwin で "filesystem" の encoding が正しくないケース (Open)" href="https://bugs.ruby-lang.org/issues/9409">#9409</a> が Nayuta Taga によって報告されました。</p>
<hr>
<p>Bug <a class="issue tracker-1 status-1 priority-4 priority-default" title="Bug: Cygwin で "filesystem" の encoding が正しくないケース (Open)" href="https://bugs.ruby-lang.org/issues/9409">#9409</a>: Cygwin で "filesystem" の encoding が正しくないケース<br>
<a href="https://bugs.ruby-lang.org/issues/9409" class="external">https://bugs.ruby-lang.org/issues/9409</a></p>
<ul>
<li>作成者: Nayuta Taga</li>
<li>ステータス: Open</li>
<li>優先度: Normal</li>
<li>担当者:</li>
<li>カテゴリ:</li>
<li>対象バージョン:</li>
<li>ruby -v: ruby 2.2.0dev (2014-01-14 trunk 44594) [i386-cygwin]</li>
<li>Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN</li>
</ul>
<hr>
<p>Cygwin で環境変数 LANG に設定されているエンコーディングと<br>
システムのコードページが異なる場合<br>
"filesystem" の encoding が正しく設定されないようです。</p>
<p>例えば、</p>
<ul>
<li>Windows 7 (日本語)</li>
<li>Cygwin 環境 (CYGWIN_NT-6.1-WOW64 ****** 1.7.27(0.271/5/3) 2013-12-09 11:57 i686 Cygwin)</li>
<li>環境変数 LANG は ja_JP.UTF-8</li>
<li>カレントディレクトリに「日本語.txt」という名前のファイルが存在</li>
</ul>
<p>という状態で以下のコードを実行すると</p>
<p><code>print "LANG=#{ENV['LANG']}\n" print "\n" Dir.open('.').each{|item| p item.encoding p item } print "\n" Dir.open('.',encoding: 'locale').each{|item| p item.encoding p item } print "\n" </code></p>
<p>例えば以下のような出力が得られます。</p>
<pre>LANG=ja_JP.UTF-8
#<Encoding:Windows-31J>
"."
#<Encoding:Windows-31J>
".."
#<Encoding:Windows-31J>
"test.rb"
#<Encoding:Windows-31J>
"\x{E697}\xA5\x{E69C}\xAC\x{E8AA}\x9E.txt"
#<Encoding:UTF-8>
"."
#<Encoding:UTF-8>
".."
#<Encoding:UTF-8>
"test.rb"
#<Encoding:UTF-8>
"日本語.txt"
</pre>
<p>本来ならば全ての Encoding が UTF-8 であるべきだと思います。</p>
<p>Init_enc_set_filesystem_encoding() を以下のように修正すれば修正可能です。</p>
<pre>
Index: localeinit.c
===================================================================
--- localeinit.c (revision 44594)
+++ localeinit.c (working copy)
@@ -53,7 +53,7 @@
int idx;
#if defined NO_LOCALE_CHARMAP
# error NO_LOCALE_CHARMAP defined
-#elif defined _WIN32 || defined __CYGWIN__
+#elif defined _WIN32 && !defined __CYGWIN__
char cp[sizeof(int) * 8 / 3 + 4];
snprintf(cp, sizeof cp, "CP%d", AreFileApisANSI() ? GetACP() : GetOEMCP());
idx = rb_enc_find_index(cp);
</pre>
<p>--<br>
<a href="http://bugs.ruby-lang.org/" class="external">http://bugs.ruby-lang.org/</a></p>
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=44282
2014-01-14T09:30:32Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/44282/diff?detail_id=32012">diff</a>)</li></ul><p>filesystem encodingはシステムの設定を反映するので、意図通りの動作ですね。</p>
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=44284
2014-01-14T09:35:48Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>ruby -v</strong> changed from <i>ruby 2.2.0dev (2014-01-14 trunk 44594) [i386-cygwin]</i> to <i>-</i></li></ul>
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=44287
2014-01-14T10:10:17Z
ganaware (Nayuta Taga)
<ul></ul><p>Nobuyoshi Nakada wrote:</p>
<blockquote>
<p>filesystem encodingはシステムの設定を反映するので、意図通りの動作ですね。</p>
</blockquote>
<p>Windows ネイティブ環境ならばそうかもしれませんが、<br>
Cygwin 環境ですので LANG に設定されているエンコーディングに従うべきではないのでしょうか?</p>
<p>少なくとも LANG=ja_JP.UTF-8 の状態で<br>
<code>Dir.open('.').each{|item| p item.encoding }</code><br>
が<br>
<code>#<Encoding:Windows-31J></code><br>
になるのはかなり予想外の挙動と言えると思います。</p>
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=44297
2014-01-14T15:29:49Z
usa (Usaku NAKAMURA)
usa@garbagecollect.jp
<ul></ul><p>Nayuta Taga wrote:</p>
<blockquote>
<p>Windows ネイティブ環境ならばそうかもしれませんが、<br>
Cygwin 環境ですので LANG に設定されているエンコーディングに従うべきではないのでしょうか?</p>
</blockquote>
<p>Cygwinだろうがなんだろうが、Windowsにおいて、ファイルシステムの保持する<br>
エンコーディングをRubyが勝手に違うものとみなすことはできません。</p>
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=44308
2014-01-15T02:01:02Z
ganaware (Nayuta Taga)
<ul><li><strong>File</strong> <a href="/attachments/4191">test.c</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/4191/test.c">test.c</a> added</li></ul><p>Usaku NAKAMURA wrote:</p>
<blockquote>
<p>Nayuta Taga wrote:</p>
<blockquote>
<p>Windows ネイティブ環境ならばそうかもしれませんが、<br>
Cygwin 環境ですので LANG に設定されている<br>
エンコーディングに従うべきではないのでしょうか?</p>
</blockquote>
<p>Cygwinだろうがなんだろうが、Windowsにおいて、ファイルシステムの保持する<br>
エンコーディングをRubyが勝手に違うものとみなすことはできません。</p>
</blockquote>
<p>まず、Cygwin 特有の事情をご説明いたします。</p>
<p><a href="http://cygwin.com/cygwin-ug-net/setup-locale.html" class="external">http://cygwin.com/cygwin-ug-net/setup-locale.html</a></p>
<blockquote>
<p>Cygwin uses the setting of the locale environment variables LC_ALL,<br>
LC_CTYPE, and LANG, to determine how to convert Windows filenames<br>
from their UTF-16 representation to the singlebyte or multibyte<br>
character set used by Cygwin.</p>
<p>The setting of the locale environment variables at process startup<br>
is effective for Cygwin's internal conversions to and from the<br>
Windows UTF-16 object names for the entire lifetime of the current<br>
process. Changing the environment variables to another value changes<br>
the way filenames are converted in subsequently started child<br>
processes, but not within the same process.</p>
</blockquote>
<p>つまり Cygwin のファイル名のエンコーディングは、<br>
Cygwin プロセス起動時に設定されていた LANG に左右されます。<br>
(これは一般的なUnixとは異なる挙動だと思います)</p>
<p>例えば、添付ファイル test.c を以下の手順で実行するとします。</p>
<ol>
<li>gcc test.c</li>
<li>cygwin プロセスを全て終了させる</li>
<li>cmd.exe を起動する</li>
<li>c:\> echo test > 日本語.txt</li>
<li>c:\> set LANG=ja_JP.SJIS</li>
<li>c:\> a.exe > result_sjis.txt</li>
<li>c:\> set LANG=ja_JP.UTF-8</li>
<li>c:\> a.exe > result_utf8.txt</li>
</ol>
<p>この結果は以下のようになります。</p>
<ul>
<li>result_sjis.txt は SJIS で「日本語.txt」という文字列が含まれる。</li>
<li>result_utf8.txt は UTF-8 で「日本語.txt」という文字列が含まれる。</li>
</ul>
<p>ですから、ファイルシステムの保持するエンコーディングはLANG によって決定<br>
されるエンコーディングだとみなしてよいと思われます。</p>
<p>また、コメント1の出力で</p>
<pre><code>#<Encoding:Windows-31J>
"\x{E697}\xA5\x{E69C}\xAC\x{E8AA}\x9E.txt"
</code></pre>
<p>というものがありますが、これは UTF-8 の文字列に誤って Windows-31J とい<br>
うエンコーディングが付加されている状態となります。したがって<br>
<code>item.force_encoding('locale')</code> などとしなければ利用できませんのでかなり<br>
予想外の挙動となります。</p>
Ruby master - Bug #9409: Cygwin で "filesystem" の encoding が正しくないケース
https://bugs.ruby-lang.org/issues/9409?journal_id=97658
2022-05-19T08:20:02Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul><li><strong>Assignee</strong> set to <i>cygwin</i></li></ul>