Linux와 Windows .txt 파일의 차이점 (유니 코드 인코딩)


16

원래 ANSI 표준에 정의 된 128 자 세트 만 사용하고 있습니다.

그러나 전체적으로 파일이 어떻게 다른 방식으로 영향을 받습니까?

디스플레이에 관심이 없습니다. 즉, 탭이 6 또는 8 자로 표시되지만 메모리의 실제 내부 표현 인 경우

내가 들었던 한 가지 차이점은 \ r \ n (Windows) 대 \ n을 줄 종결 (Linux)에 사용한다는 것입니다.


바이트 순서 표시가 Windows에서 Linux로 전송 된 PHP 파일에서 #! (첫 번째 줄)을 죽이고 있다고 생각합니다. 전체 파일이 작동하지만 인터프리터를 찾을 수 없습니다. 메모장에서 인코딩 방법을 선택하여 ANSI로 인코딩해야하는지 확인하십시오. 이는 ASCII이거나 Windows가 다른 작업을 수행합니까

Gnu / Linux 상자에 bomstrip이 있는지 확인하십시오. 데비안 (그리고 최소한 다른 것)의 일부이지만 설치가 필요할 수 있습니다. Microsoft가 utf-8 파일의 시작 부분에 BOM을 잘못 추가하기 때문에 필요합니다.
ctrl-alt-delor

답변:


17

Windows에서 "유니 코드"는 UTF-16LE이며 각 문자는 2 또는 4 바이트입니다. Linux는 UTF-8을 사용하며 각 문자는 1-4 바이트입니다.

"절대적으로 모든 소프트웨어 개발자는 절대적으로 유니 코드 및 문자 집합에 대해 반드시 알아야합니다 (변명 없음)"


윈도우가 바이트를 낭비합니까?

1
Latin-1 이외의 것을 사용하지 않는다면 그렇습니다.
Ignacio Vazquez-Abrams

그들은 내가 링크 한 기사에 있습니다.
Ignacio Vazquez-Abrams

1
UTF-16LE에 대한 검색을 실행했지만 기사에서 찾지 못했습니다.

1
대개. 존재하는 경우 BOM 도 계산해야합니다 .
Ignacio Vazquez-Abrams

11

줄 바꿈

Windows는 CRLF ( \r\n, 0D 0A) 줄 끝을 사용하지만 Unix는 LF ( \n, 0A) 만 사용합니다 .

문자 인코딩

가장 현대적인 (즉 2004 년 이후) 유닉스 계열 시스템은 UTF-8 을 기본 문자 인코딩으로 만듭니다.

그러나 Windows에는 UTF-8에 대한 기본 지원이 없습니다. 내부적으로 UTF-16으로 작동하며 char기반 문자열이 레거시 코드 페이지 에 있다고 가정합니다 . 다행히 메모장은 UTF-8 파일을 읽을 수 있습니다. 불행히도 "ANSI"인코딩이 여전히 기본값입니다.

문제가있는 특수 문자

U + 001A 대체품

Windows는 드물게 Ctrl+ Z를 파일 끝 문자로 사용합니다. 예를 들어, type명령 프롬프트에 파일이 있으면 첫 번째 1A바이트 에서 잘립니다 .

유닉스에서 Ctrl+ Z는 특별한 것이 아닙니다.

NO-BREAK SPACE가있는 U + FEFF ZERO (바이트 순서 표시)

Windows에서 UTF-8 파일은 종종 "바이트 순서 표시" EF BB BF로 시작하여 ANSI 파일과 구별됩니다.

Linux에서는 BOM이 쉘 스크립트에서 shebang 행과 같은 것을 끊기 때문에 권장하지 않습니다. 또한 UTF-8이 기본 인코딩 인 경우 UTF-8 서명을 갖는 것은 의미가 없습니다.


1
Ctrl-Z는 sttyLinux에서 Ctrl-D (또는 EOF에 바인드 된 문자)와 마찬가지로 Windows에서 작동 합니다. 콘솔 드라이버는이를 파일 끝으로 변환합니다. 리터럴 문자는 입력 스트림에 나타나지 않습니다. 그것은 단지 read ()가 0을 리턴하게한다.
psusi

바이트 순서 표시가 Windows에서 Linux로 전송 된 PHP 파일에서 #! (첫 번째 줄)을 죽이고 있다고 생각합니다. 전체 파일이 작동하지만 인터프리터를 찾을 수 없습니다. 메모장에서 인코딩 방법을 선택하여 ANSI로 인코딩해야합니다 .ASCII가 사실입니까 아니면 Windows가 다른 작업을 수행합니까?

1
의사 용어 "ANSI 코드 페이지"는 여전히 메모장과 같은 프로그램에 나타나지만 완전히 잘못된 이름이며 Microsoft는 오래 전에 인정했습니다. 자세한 내용은 en.wikipedia.org/wiki/Windows_code_page 를 참조하십시오.
Incnis Mrsi

utf-8에는 BOM이 없지만 MS-Windows는 BOM을 삽입합니다. utf-8이 아닌 사실. utf-8의 규칙 중 하나는 ascii로 표현 될 수있는 모든 파일이 utf-8에서 비트와 동일하다는 것입니다. 또한 스트림의 어느 시점에서나 utf-8을 읽을 수 있습니다.
ctrl-alt-delor

3

내가 들었던 한 가지 차이점은 줄 바꿈 (Linux)에 \ r \ n (Windows) 대 \ n을 사용한다는 것입니다.

예. 대부분의 UNIX 텍스트 편집기는이를 자동으로 처리하고 Windows 프로그래머 편집기는이를 처리 할 수 ​​있지만 일반 텍스트 편집기 (기본 메모장)는 처리하지 않습니다.

Windows 에서는 일부 상황에서 EOF (Ctrl-Z)가 파일 끝 으로 필요 하지만 UNIX에서는 절대 볼 수 없습니다.

MacOS X는 이제 UNIX 아래에 있으므로 UNIX 줄 끝을 사용합니다. OS X (MacOS 9 이하) 이전에는 자체 종료 (\ r)가있었습니다.

편집 : 다른 형식으로 CR 및 LF :

  • \ n은 ASCII 0x0A, 줄 바꿈 (LF)입니다.
  • \ r은 ASCII 0x0D, 캐리지 리턴 (CR)입니다.

ASCII 문자 집합에서 \ r \ n 및 \ n은 어디에 있습니까? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

2
@Chris \ n은 ASCII 0x0A, 줄 바꿈입니다. \ r은 ASCII 0x0D, 캐리지 리턴
Rich Homolka

@Rich EOF는 어떻습니까? 이것은 ANSI 문자입니까?

2
@barlop, 터미널은이 제어 키가 비활성화되어 있지 않으면 키 입력 (일반적으로 UNIX 시스템에서는 ctrl-d)을 EOF로 변환합니다. 응용 프로그램은 실제 키를 누르지 않고 EOF를 읽습니다. 즉, read()특정 문자 대신 0 바이트를 반환합니다.
psusi

1
@ barlop, 그것은 내가 말한 것입니다 : 어떤 문자도 반환하지 않습니다 . read ()는 버퍼에 저장된 바이트 수를 반환합니다. EOF에서는 단순히 0 바이트를 제공합니다. 그것은 파일의 끝에 도달했으며 더 이상 읽을 것이 없다는 신호입니다.
psusi

1

사용되는 유니 코드 인코딩은 OS 기반이 아닙니다.

Windows notepad.exe조차도 옵션이 나열되어 있습니다-(유니 코드가 아닌 ANSI), 유니 코드 (유니 코드 LE는 유니 코드 LE), 유니 코드 빅 엔디 언 (BE), UTF-8

ANSI는 유니 코드가 아니며 매우 제한된 수의 문자를 포함하므로 따로 보관하십시오.

그러나 메모장조차도 LE, BE 또는 UTF-8을 할 수 있음을 참조하십시오

메모장은 제쳐두고 UTF-8은 BOM의 유무에 관계없이 가능합니다.

그리고 Cygwin과 함께 Windows를 사용하지만 \ n을 지정하더라도 Windows 포트가 \ r \ n을 잘 수행 할 수 있습니다.

특정 OS가 사용하는 유니 코드 인코딩에 대한 규칙은 없습니다. 있다면 매우 유연한 OS가 아닐 것입니다.

차이점을 실제로 이해하려면 소프트웨어, 소프트웨어 조각의 인코딩 또는 사용에 대한 지식이 필요합니다.

Cygwin 및 xxd 및 / 또는 16 진 편집기를 가져 와서 실제로 파일 내부의 내용을보십시오. 'file'명령을 사용하여 파일을 식별하십시오. 그러면 실제로 UTF 16bit LE가 무엇인지 알 수 있습니다. UTF 16bit BE는 무엇입니까? UTF-8이란 무엇입니까 (및 UTF-8은 BOM의 유무에 관계없이).

때로는 메모장에 유니 코드로 저장하도록 지시 할 수 있습니다 (메모는 16 비트 리틀 엔디안을 의미합니다). 그러나 arial unicode와 같은 unicode 글꼴을 선택하고 charmap에서 일부 unicode 문자를 복사하면됩니다. 메모장과 소프트웨어가 수행하는 작업을 확인하는 좋은 방법은 파일의 16 진수를 보는 것입니다.

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

dd 명령 (Windows의 cygwin에서 실행하는 * nix 명령)으로 전환 할 수 있습니다

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

메모장 자체는 UTF-16 Big Endian 또는 UTF-16 Little Endian 또는 UTF-8로 저장할 수 있습니다.

여기에 이미지 설명을 입력하십시오

기술 담당자이거나 심지어 메모장 사용자 인 경우 OS로 인해 하나의 인코딩에 구속되지 않습니다!

UTF-8이 UTF-16보다 더 의미가 있다고 가정하면 UTF-16은 8 비트 만 필요한 문자에도 16 비트를 사용합니다. 또한 charmap은 UTF-16 코드를 보여줍니다.

Sublime (Windows 텍스트 편집기)은 기본적으로 유니 코드를 UTF-8로 저장합니다.

Windows와 때로는 유니 코드를 사용하며 주로 UTF-8을 사용하고 있습니다.

그리고 Windows는 기술적으로 융통성이 있기 때문에 Linux는 기술적으로 융통성이 있습니다!


당신은 명령을 쓰기나요 filetypeCygwin에서 프롬프트 내부를?
Vesnog

xxdtype명령은 표준 Cygwin에서 설치 I의 가정에서 누락되었습니다. 그 외에도 결과를 재현하고 싶습니다.
Vesnog

1
@Vesnog type는 cmd.exe에 기본 제공되는 표준 명령 xxd으로 기본적으로 cygwin과 함께 설치되지 않을 가능성이 높지만 cygwin을 설치하거나 설치 한 후에 cygwin 설치를 시작하면 cygwin에서 사용할 수있는 긴 명령 목록을 얻습니다. cygwin 설정 검색 상자에 xxd를 입력하면 나타납니다. xxd는 vim7을 설치 한 후에도 구할 수 있으므로 거기에서 구할 수도 있습니다.
barlop

1
@Vesnog cygwin 내부 또는 cygwin 외부에서 cygwin 명령을 실행할 수 있습니다. cygwin 외부에서 실행하는 c:\cygwin\bin경우 (cygwin의 bin 서브 디렉토리가있는 경우) 경로에 추가하십시오. 또한 'type'또는 'dir'과 같은 내부 cmd 명령 또는 calc.exe (windows calculator)와 같은 외부 exe는 cygwin 내에서 실행 / 시작될 수 있습니다. cygwin에서 실행할 수있는 대부분은 cmd에서 실행할 수 있으며 그 반대도 가능합니다. bash를 사용하려면 cygwin을 사용하고 작은 따옴표와 큰 따옴표로 인해 문제가 발생하면 cygwin 내에서 cygwin 명령을 실행하고 cmd 내에서 cmd 명령을 실행하십시오.
barlop

1
@Vesnog xxd는 파일을 쓸 수도 있습니다. 예 echo 61|xxd -r -p>a.a를 들어 시도하십시오. type a.a 따라서 실제로 xxd -p로 바이트 덤프를 가져 와서 바이트를 재 배열하거나 수정 한 다음 xxd -r -p로 피드하고 다른 인코딩으로 새 파일을 얻거나 이전 데이터를 기반으로 다른 데이터. "file"명령은 바이트를 기준으로 인코딩을 계산합니다.
barlop

-1

Linux는 UTF-8을 사용하며 각 문자는 1-4 바이트가 아닌 1-6 바이트입니다.

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

이것은 2011 년에 제출 된 답변에서 이미 언급되었습니다.
Ramhound
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.