UTF8文字が原因でファイルにアクセスできなくなります。

UTF8文字が原因でファイルにアクセスできなくなります。

私が実行した場合:

scp [email protected]:/home/me/cömmön_file.jpg /home/me/

私のリモートサーバーから以下を取得します。

scp:/home/me/cömmön_file.jpg: そのファイルやディレクトリはありません

utf8文字をワイルドカードに置き換えると機能します。

scp [email protected]:/home/me/c?mm?n_file.jpg /home/me/

そして/または

scp [email protected]:/home/me/c*mm*n_file.jpg /home/me/

リモートシステムでAWS CLIを使用している場合でも、この動作はレプリケートされます。

リモートコンピュータで明示的な名前を使用して別のコマンドを実行すると、期待どおりに機能します。

例えば

ls -lha /home/me/cömmön_file.jpg

-rw-r--r--. 1 我我1.1M 1月15日 21:58 /home/me/cömmön_file.jpg

ファイル名の変更も使用できますmv

ファイル転送の問題ですか、それともファイルをホストしているコンピュータの基本的な問題ですか?

現在問題を引き起こすUTF8文字は次のとおりです。https://www.compart.com/en/unicode/U+0308しかし、この問題は他のキャラクターでも再現されると予想されます。ファイル名öを変更しようとするとhttps://www.compart.com/en/unicode/U+00F6私のコンピュータは、ファイルが同じであることを伝えます。

mv: '/home/me/cömmön_file.jpg' と '/home/me/cömmön_file.jpg' は同じファイルです。

このファイルをホストするサーバーは次のとおりです。

NAME="CentOS Linux"
VERSION="7 (Core)"

それはlocale

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

ファイルを要求するサーバーは次のとおりです。

NAME="Amazon Linux"
VERSION="2"

それはlocale

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

ベストアンサー1

scpクイックフィックス:キーボードでアクセント文字を使用するのではなく、タブの完成を使用するか(ネットワークなどでタブを使用できるようにSSHキーを設定するrsync)、一般的な期待される動作であるため、ワイルドカードに置き換えます。


これはうまくいきません。なぜなら同じファイル名を入力していません。

クレイジーだと思いますか?これはUTF-8です。

もっとクレイジーなこと:私は私のものを使うことができます遠隔心読書の魔法のような霊的な力君に一つあると教えてアップルコンピュータ

もっと真剣に言えば、これは質問時に提供することを忘れましたが、質問自体を入力したときに誤って公開した重要な情報です。


上記の回答をコピーして貼り付けたとき:

# echo "scp [email protected]:/home/me/cömmön_file.jpg" | hexdump -C
00000000  73 63 70 20 6d 65 40 65  78 61 6d 70 6c 65 2e 63  |scp [email protected]|
00000010  6f 6d 3a 2f 68 6f 6d 65  2f 6d 65 2f 63 6f cc 88  |om:/home/me/co..|
00000020  6d 6d 6f cc 88 6e 5f 66  69 6c 65 2e 6a 70 67 20  |mmo..n_file.jpg |
00000030  2f 68 6f 6d 65 2f 6d 65  2f 0a                    |/home/me/.|
0000003a

文字「ö」がどのようにエンコードされるかを注意深く見てください6f cc 88。文字「o」の後に追加のUTF-8コードポイントが続きます。 (実際に私の端末では「ö」とは表示されず、「o」と表示されます)

私(= Linuxユーザー)が次のように入力したとき:

echo /home/me/cömmön_file.jpg | hexdump -C
00000000  2f 68 6f 6d 65 2f 6d 65  2f 63 c3 b6 6d 6d c3 b6  |/home/me/c..mm..|
00000010  6e 5f 66 69 6c 65 2e 6a  70 67 0a                 |n_file.jpg.|
0000001b

「ö」記号をもう一度詳しく見てください。c3 b6これはまったく異なるUTF-8コードポイントであり、追加のASCII文字はありません。


非常に簡単な説明:UTF-8正規化(合成と分解)


詳細な説明:

Unicodeには「ö」のようなものをエンコードするいくつかの方法があります。

  • 最初の方法はキャラクターで構成:Latin-1(ISO / IEC 8859-1:1998)コードポイント、UnicodeコードポイントU + 00f6(UTF-8からc3 b6にエンコードされている)から継承されたコードポイント「ö」があります。
  • 2番目の方法は分解された文字:まずASCII oを出力してから特殊コードポイントを追加します。この言葉は前の文字に発音区別記号を追加してください'、UnicodeコードポイントU + 0308(UTF-8からcc 88にエンコード)

̫cra̎zyshit̫ke̬̓ke̬̓king̬̓king̬̓KITHIPAIL, ̌m̳͌̽m̳͌̽a̪ͥd̺͑n͕͌̐e̿͊s͇s̘Γ͊のすべてができるようにするのがこの組み合わせ

吸引。

残りの地域では、可能であれば結合文字を使用し(よりコンパクトで、Latin-1互換のUnicodeスコープを使用して以前のバージョンとの互換性を簡素化するため)、結合文字のない項目にのみ結合文字を使用します。独自のコードポイント(主に一般的ではない言語用)

Appleは明らかに他の惑星に住んでいて、常にキャラクターを使うことにしました(彼らは暗闇のZaを崇拝しているので、 ̓ΗΗ?)。

「ö」などのキーボード文字を入力しても、キーを入力しているコンピュータによっては、同じバイナリシーケンスが生成されません。

その後、別の問題が発生します。ほとんどのUnixは大文字と小文字を区別し、Unicodeエンコーディング(UTF-8をサポート)に敏感なファイルシステム(LinuxのEXT4など)を使用する傾向があります。彼らはテキストが書かれているかどうかを保存しようとします。したがって、同じ最終結果「ö」をエンコードして6f cc 88も、UTF-8バイナリシーケンスを区別します。c3 b6(同じラテン文字でも「A」と「a」を同じ方法で区別します。)したがって、キーボードで生成された「ö」は、サーバーで生成された「ö」と同じではありません。

スタック交換は、ユーザーが入力したUnicodeエンコーディングをそのまま保存し、秘密の答えを提供します。HTML正規表現パーサーそれら。 (それで、Macは「ö」の特定のバイトシーケンスを記録して自分自身を裏切りました。)

おすすめ記事