Linuxでファイル名が「正常」に見えるのに、Windowsではリモートではないのはなぜですか?


11

同僚と作業しているときに、エンコードに関連していると思われる奇妙な問題を発見しました。私たちは、このような単純な十分なファイル名持っている一部の画像で作業しているcity.gifかをwine.gif、しかし、1つは期待通りなどの特殊文字を使用するときに物事が複雑になりéëà。また、これらの文字を含むオランダ語のデータcafé(たとえばpub)も処理しています。(ファイルの出所を制御することはできません。)ここで問題が発生し始めます。以下のファイル名は一例です。この問題は、発音区別符号を持つ他の文字でも発生します。

café-2.png
cafetaria.png
café.png

最初と最後のアイテムにはアクセント付きのeが必要です(アクセントaigu、é)。これは、Linux(CentOS 6&7)の実行時にターミナルで表示される方法lsです。しかし、ここでWindowsが登場します。(Windows 10、64ビットを使用します。)WindowsでSSLを介してサーバーに接続してからを呼び出すlsと、上記のリストは次のようになります。

café-2.png
cafetaria.png
caf▒.png

うまく行けばわかると思いますが、最初の行にはまだアクセント付きeが éありますが、3番目の行にはありません。代わりに、この文字が表示さmedium shadeれます-これはUnicode(10進数9618)です。これ自体は奇妙です。ただし、Filezillaを使用してSFTP経由で接続すると(Windowsでも)、次のようになります。

café-2.png
cafetaria.png
café.png

これで状況éは一変しました。最初の1つはシーケンスに変更され、3番目の1つはすべて順調です。私が見つけたのは、これが正しければ、Latin-1 <-> UTF-8変換が間違っていたことが原因である可能性が高いです。しかし、それだけでは不十分です。

Linuxは期待どおりにすべてを表示し、Windowsはファイル名の表示方法(SSH(putty)、またはSFTP(filezilla))に応じて一貫性のない動作を示します。これらのファイル名を「正規化」する(つまり、編集する)方法はありますか。また、すべてのOSで同じであることを確認してください。または少なくとも一貫しており、そうであればどのように?UTF-8選択したエンコーディングです。

これは単に美的問題と同じかもしれませんが、そうではありません。LinuxサーバーからWindowsのSFTPを介してダウンロードしようとすると、上記の問題のあるファイルをダウンロードできません。FilezillaはのようなエラーをスローしますCan't download file café-2.png: café-2.png does not exist on the server。これは、Filezillaがディレクトリとファイル名を読み取り、それを何らかのエンコーディングで解釈し、GETリクエストをその解釈とともにサーバーに送信するように見えますが、その解釈はLinuxファイル名とは異なるため、ファイルは見つかりません。

結局、なぜこれが発生するのかにも興味がありますが、利用可能な解決策があればいいのですが。イメージファイルが異なるオペレーティングシステムで作成された可能性があるために発生しますか?Linuxサーバーがそれらを間違って解釈するために発生しますか、それともWindowsが混乱していますか?うまくいけば、システム管理者に連絡してサーバー構成のスイッチをオンにするように依頼できるソリューションがありますが、それはそれほど簡単ではないようです。


1
これはクライアント(PuTTYなど)とその構成の問題であり、Windowsには関係ありません。PuTTYの場合、それは翻訳セクションで行われます。
トーマスディッキー2017年

2
「café-2.png」のéはUTF-8でエンコードされているように見えますが、「café.png」のéはISO-8859-1でエンコードされています。あなたは実行することができますpython -c "import sys; print(repr(sys.argv[1]))" café-2.pngpython -c "import sys; print(repr(sys.argv[1]))" café.png
Oskar Skog 2017年

@OskarSkog朝にやってみます。しかし、私はいつもファイル名にエンコーディングが「ある」とは考えていませんでした。つまり、OSが要求するとおりです。それは、異なるファイルが異なるOSで作成されたことを意味しますか?(ファイルの出所は制御できません。)
Bram Vanroy 2017年

UNIXのようなオペレーティングシステムでは、ファイル名は単なるバイトの文字列です。キャラクターのコンセプトはより高いレベルにあります。
Oskar Skog 2017年

1
答えや解決策にさえ近いものではなく、単に追求する道についての考えです。OPから、ファイルはさまざまなオリジンを持ち、ソースによって生成された名前を制御できないようであり、フィルターを適用して着信ファイル名snafusを修正するには遅すぎます。解決策としては、ファイル名のエラーを検出して修正できるサーバー上でスクリプトを実行し、場合によっては名前に使用される文字セット/コードページを標準化することも考えられます。その後、OPはFilezillaまたは他のクライアントで同じコードページを使用でき、問題はありません。私のスキルを超えていますが、たぶん従うべきリードです。
user207673

回答:


11

しかし、ここでWindowsが登場します。

Windowsはこれとは何の関係もありません。あなたは、のために適切に選択された端末のエンコードおよび適切に構成されたロケールで、(例えば)GNOME端末のローカルインスタンスと同じ正確な動作を再現することができls、任意のWindowsは、画像にされることなく、すべてで

Windowsが行う唯一のことは、ここで何が行われているのかを明確に示すことです。Windows FTPプログラムは、ファイル名のバイトを取り、それらをコードページ1252の関連するコードポイントとして表示します。これは、0x1Fより上のほとんどすべてが印刷可能なグリフのシングルバイトエンコーディングで、ファイル名のバイトが正確に何であるかを教えてくれます。 。

2番目のファイル名はほとんど情報がありませんが、1番目と3番目はわかります。

  • 最初のファイル名はバイトシーケンス63 61 66 c3 a9 2d 32 2e 70 6e 67ですcafé-2.png。コードページ1252ではです。これはのUTF-8エンコーディングでもありcafé-2.pngます。
  • 3番目のファイル名はバイトシーケンス63 61 66 e9 2e 70 6e 67ですcafé.png。コードページ1252では、これはです。ただし、有効なUTF-8エンコーディングではありません。 e9不完全な文字エンコーディングシーケンスを開始します。

つまり、何がコードページ1252を使用していないが、UTF-8を使用している、つまり、SSHセッションとローカルターミナルエミュレータが有効な UTF-8を互いに同じ方法で処理していますが、無効な UTF-8 2つの異なる方法で:

  • ブロックグラフィックを表示しているものは、おそらくそのブロックグラフィックを無効なUTF-8シーケンスの一般的な置換出力文字として単に使用しているだけです。
  • 文字を表示してéいるものは、無効なエンコーディングに遭遇すると、コードページ1252にフォールバックします。

根本的な問題は、UTF-8としてエンコードされたいくつかのファイル名と、コードページ1252でエンコードされた他のファイル名を何らかの方法で生成しているシステムです。


Windowsがこれと関係がないことに同意しません。他のLinuxではおそらく起こりません。問題はデフォルトのエンコーディングであり、afaik WindowsはUTFではなくCPを使用していた(または少なくとも使用していた)ため、この問題は国の同じOSでも発生します。Linuxでもこれを再現できますが、LinuxはUnicodeの選択においてより一貫しています
MatthewRock

こんにちは!精巧な答えをありがとう。あなたは何が起こっているのかに焦点を当てています。しかし、これがなぜ起こっているのか、そしてこの不整合から生じる問題にどのように対処できるかについて、あなたはおそらく光を当てることができますか?意味を明確にするために2つの段落を追加しました。
Bram Vanroy 2017年

なぜ両方の「カフェ」が同じように表示されていないのでしょうか。GNUのls(1)にはばかげたエンコーディングエラー処理がありますか?
Oskar Skog 2017年

@MatthewRockこの場合、私はWindowsが本当にそれとは関係がないと思います。私はM $が行うことのほとんどに満足しておらず、その悪の多くを喜んで認めていますが、何も原因がないことに起因する非難を見ることができません。答えがはっきりしているように、問題は名前自体のバイト値にあります。この例では、Windowsが症状を示しましたが、問題ではありません。それがあなたの熱が104°であることを示すとき、温度計だけが問題です。問題は、OPがアクセスしようとしているファイルがあるサーバー上で名前を作成したプロセスに起因します。
user207673

より多くの情報と可能な解決策を提供できますか?それ以外の場合、私は賞金を無料で使いました。
Bram Vanroy 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.