Linux에서 파일 이름이 '정상'으로 보이지만 Windows에서 원격으로 표시되지 않는 이유는 무엇입니까?


11

동료와 일하면서 인코딩과 관련된 이상한 문제가 발견되었습니다. 우리는 다음과 같은 간단한 충분한 파일 이름이 일부 이미지로 작업 city.gif또는 wine.gif하지만, 하나는 예상대로 같은 특수 문자를 사용할 때 일을 더 복잡하게 é, ë, à. 또한 café( pub ) 와 같은 문자가 포함 된 네덜란드 데이터를 사용하고 있습니다. (파일의 출처를 제어 할 수는 없습니다.) 여기서 문제가 발생하기 시작합니다. 다음 파일 이름은 예일뿐입니다. 분음 부호가있는 다른 문자에도이 문제가 발생합니다.

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

첫 번째 항목과 마지막 항목에는 악센트가있는 e 가 있어야합니다 (액센트 aigu, é). 이것이 실행 중 터미널의 Linux (CentOS 6 & 7)에 표시되는 방식 ls입니다. 그러나 여기에 Windows가 온다! (Windows 10, 64 비트 사용) 서버에서 SSL을 통해 Windows에 연결 한 다음을 호출 ls하면 위의 목록은 다음과 같습니다.

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

잘 아시다시피, 첫 번째 줄에는 여전히 악센트가있는 e é 가 있지만 세 번째 줄에는 그렇지 않습니다. 대신 유니 코드 (십진수 9618) 인 이 문자를 봅니다 medium shade. 이것은 그 자체로 이상합니다. 그러나 Filezilla로 SFTP를 통해 연결할 때 (여전히 Windows에서는)이를 볼 수 있습니다.

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

이제 상황이 바뀌 었습니다. 첫 번째 é는 시퀀스로 바뀌었고 세 번째는 모든 것이 정상입니다. 나는 이것이 올바르게된다면 잘못 된 라틴 -1 <-> UTF-8 변환으로 인한 것임을 여기 에서 발견 했다 . 하지만 그게 전부가 아닐 수도 있습니다.

리눅스는 예상대로 모든 것을 보여주고, 윈도우는 파일 이름을 보는 방식 (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가 엉망이기 때문에 발생합니까? 바라건대 sysadmin에 연락하여 서버 설정에서 스위치를 켜도록 요청할 수있는 솔루션이 있지만 그렇게 쉽지는 않습니다.


1
그것은 클라이언트 (PuTTY 등)와 그 구성의 문제이며 Windows와 관련이 없습니다. PuTTY의 경우 번역 섹션 에서 수행됩니다 .
토마스 디키

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

@OskarSkog 나는 아침에 그것을 시도합니다. 그러나 나는 항상 파일 이름이 인코딩을하지 않는다고 생각했습니다. 즉, OS가 원하는대로입니다. 그렇다면 다른 파일이 다른 OS에서 만들어 졌다는 의미입니까? (우리는 파일의 출처를 제어 할 수 없습니다.)
Bram Vanroy

운영 체제와 같은 유닉스에서 파일 이름은 바이트 문자열입니다. 캐릭터의 개념은 더 높은 수준에 있습니다.
Oskar Skog

1
답이나 해결책에 근접하지도 않고 추구 할 길에 대한 생각 일뿐입니다. OP에서 파일이 출처에 의해 생성 된 이름을 제어하지 않고 여러 출처를 가질 수 있으며 들어오는 파일 이름 snafus를 수정하기 위해 필터를 적용하기에는 너무 늦습니다. 이 솔루션에는 파일 이름 오류를 감지하고 수정할 수있는 스크립트를 서버에서 실행하는 것이 가능하며 이름에 사용 된 문자 세트 / 코드 페이지를 표준화 할 수도 있습니다. 그런 다음 OP는 Filezilla 또는 다른 클라이언트에서 동일한 코드 페이지를 사용할 수 있으며 작동합니다. 내 기술을 넘어서지 만, 리드를 따를 수도 있습니다.
user207673

답변:


11

그러나 여기에 Windows가 온다!

Windows는 이와 관련이 없습니다. GNOME 터미널의 로컬 인스턴스 (예 : 적절하게 선택된 터미널 인코딩 및 로케일을 적절히 구성 ls)를 사용하여 Windows 에 전혀 그림 을 표시 하지 않고도 이와 동일한 정확한 동작을 재현 할 수 있습니다.

Windows가하는 유일한 일은 여기에서 무슨 일이 일어나고 있는지 명확하게 보여주는 것입니다. Windows FTP 프로그램이 파일 이름의 바이트를 코드 페이지 1252의 관련 코드 포인트로 표시하고 있습니다. 인쇄 가능한 글리프가 0x1F보다 거의 모든 것을 포함하는 단일 바이트 인코딩은 파일 이름의 바이트가 정확히 무엇인지 알려줍니다 .

두 번째 파일 이름은 대부분 정보가 없지만 첫 번째와 세 번째 파일은 말합니다.

  • 첫 번째 파일 이름은 바이트 시퀀스입니다. 63 61 66 c3 a9 2d 32 2e 70 6e 67— 코드 페이지 1252에서 이것은입니다 café-2.png. 의 UTF-8 인코딩이기도 café-2.png합니다.
  • 세 번째 파일 이름은 바이트 시퀀스입니다. 63 61 66 e9 2e 70 6e 67— 코드 페이지 1252에서 이것은입니다 café.png. 그러나 유효한 UTF-8 인코딩이 아닙니다. e9불완전한 문자 인코딩 순서를 시작합니다.

그래서 일어나고있는 일은 코드 페이지 1252를 사용 하지 않지만 SSH 세션과 로컬 터미널 에뮬레이터 와 같은 UTF-8을 사용하는 것은 서로 동일한 방식으로 유효한 UTF-8을 처리하지만 처리하고 있다는 것입니다 잘못된 UTF-8 두 가지 방법으로 :

  • 블록 그래픽을 표시하는 것은 아마도 해당 블록 그래픽 을 유효하지 않은 UTF-8 시퀀스 의 일반 대체 출력 문자 로 사용하는 것입니다 .
  • 문자를 표시하는 문자 é가 유효하지 않은 인코딩을 발견하면 코드 페이지 1252로 돌아갑니다.

근본적인 문제는 어떻게 든 UTF-8로 인코딩 된 일부 파일 이름과 코드 페이지 1252로 인코딩 된 다른 파일 이름을 생성하는 시스템입니다.


나는 Windows가 이것과 아무 관련이 없다는 것에 동의하지 않습니다. 다른 Linux에서는 발생하지 않을 것입니다. 문제는 기본 인코딩이며 afaik Windows는 CP가 아닌 UTF를 사용하지 않은 CP를 사용했기 때문에 국가마다 동일한 OS 에서도이 문제가 발생합니다. 리눅스에서도 이것을 재현 할 수 있지만 리눅스는 유니 코드를 선택할 때 더욱 일관성이 있습니다.
MatthewRock

안녕! 정교한 답변에 감사드립니다. 당신은 무슨 일이 일어나고 있는지에 초점을 맞 춥니 다. 그것은 좋은 일입니다. 나는 항상 무슨 일이 일어나고 있는지 이해하고 싶습니다. 그러나 왜 이런 일이 발생하는지, 그리고이 불일치로 인해 발생하는 문제에 어떻게 대응할 수 있는지에 대해 설명해 주시겠습니까? 의미하는 바를 명확히하기 위해 두 개의 단락을 추가했습니다.
Bram Vanroy

"카페"가 둘 다 동일하지 않은 이유가 무엇인지 궁금합니다. GNU의 ls (1)에 우스운 인코딩 오류 처리가 있습니까?
Oskar Skog

@MatthewRock이 경우 Windows는 실제로 Windows와 관련이 없다고 생각합니다. 나는 M $이하는 대부분의 일에 만족하지 않고 기꺼이 그 많은 악을 인정하지만, 그 어느 때에도 비난을받을 수는 없습니다. 대답이 명확 해지면 이름 자체의 바이트 값에 문제가 있습니다. 이 경우 Windows는 증상을 드러 냈지만 문제는 아닙니다. 열이 104 °임을 나타낼 때 온도계 이상은 문제가되지 않습니다. 문제는 OP가 액세스하려고하는 파일이있는 서버에서 이름을 만든 프로세스에서 발생합니다.
user207673

더 많은 정보와 가능한 솔루션을 제공 할 수 있습니까? 그렇지 않으면 나는 현상금을 아무것도 위해 보냈다.
Bram Vanroy 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.