원래 ANSI 표준에 정의 된 128 자 세트 만 사용하고 있습니다.
그러나 전체적으로 파일이 어떻게 다른 방식으로 영향을 받습니까?
디스플레이에 관심이 없습니다. 즉, 탭이 6 또는 8 자로 표시되지만 메모리의 실제 내부 표현 인 경우
내가 들었던 한 가지 차이점은 \ r \ n (Windows) 대 \ n을 줄 종결 (Linux)에 사용한다는 것입니다.
원래 ANSI 표준에 정의 된 128 자 세트 만 사용하고 있습니다.
그러나 전체적으로 파일이 어떻게 다른 방식으로 영향을 받습니까?
디스플레이에 관심이 없습니다. 즉, 탭이 6 또는 8 자로 표시되지만 메모리의 실제 내부 표현 인 경우
내가 들었던 한 가지 차이점은 \ r \ n (Windows) 대 \ n을 줄 종결 (Linux)에 사용한다는 것입니다.
답변:
Windows에서 "유니 코드"는 UTF-16LE이며 각 문자는 2 또는 4 바이트입니다. Linux는 UTF-8을 사용하며 각 문자는 1-4 바이트입니다.
"절대적으로 모든 소프트웨어 개발자는 절대적으로 유니 코드 및 문자 집합에 대해 반드시 알아야합니다 (변명 없음)"
Windows는 CRLF ( \r\n
, 0D 0A
) 줄 끝을 사용하지만 Unix는 LF ( \n
, 0A
) 만 사용합니다 .
가장 현대적인 (즉 2004 년 이후) 유닉스 계열 시스템은 UTF-8 을 기본 문자 인코딩으로 만듭니다.
그러나 Windows에는 UTF-8에 대한 기본 지원이 없습니다. 내부적으로 UTF-16으로 작동하며 char
기반 문자열이 레거시 코드 페이지 에 있다고 가정합니다 . 다행히 메모장은 UTF-8 파일을 읽을 수 있습니다. 불행히도 "ANSI"인코딩이 여전히 기본값입니다.
Windows는 드물게 Ctrl+ Z를 파일 끝 문자로 사용합니다. 예를 들어, type
명령 프롬프트에 파일이 있으면 첫 번째 1A
바이트 에서 잘립니다 .
유닉스에서 Ctrl+ Z는 특별한 것이 아닙니다.
Windows에서 UTF-8 파일은 종종 "바이트 순서 표시" EF BB BF
로 시작하여 ANSI 파일과 구별됩니다.
Linux에서는 BOM이 쉘 스크립트에서 shebang 행과 같은 것을 끊기 때문에 권장하지 않습니다. 또한 UTF-8이 기본 인코딩 인 경우 UTF-8 서명을 갖는 것은 의미가 없습니다.
stty
Linux에서 Ctrl-D (또는 EOF에 바인드 된 문자)와 마찬가지로 Windows에서 작동 합니다. 콘솔 드라이버는이를 파일 끝으로 변환합니다. 리터럴 문자는 입력 스트림에 나타나지 않습니다. 그것은 단지 read ()가 0을 리턴하게한다.
내가 들었던 한 가지 차이점은 줄 바꿈 (Linux)에 \ r \ n (Windows) 대 \ n을 사용한다는 것입니다.
예. 대부분의 UNIX 텍스트 편집기는이를 자동으로 처리하고 Windows 프로그래머 편집기는이를 처리 할 수 있지만 일반 텍스트 편집기 (기본 메모장)는 처리하지 않습니다.
Windows 에서는 일부 상황에서 EOF (Ctrl-Z)가 파일 끝 으로 필요 하지만 UNIX에서는 절대 볼 수 없습니다.
MacOS X는 이제 UNIX 아래에 있으므로 UNIX 줄 끝을 사용합니다. OS X (MacOS 9 이하) 이전에는 자체 종료 (\ r)가있었습니다.
편집 : 다른 형식으로 CR 및 LF :
read()
특정 문자 대신 0 바이트를 반환합니다.
사용되는 유니 코드 인코딩은 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는 기술적으로 융통성이 있습니다!
file
및 type
Cygwin에서 프롬프트 내부를?
xxd
및 type
명령은 표준 Cygwin에서 설치 I의 가정에서 누락되었습니다. 그 외에도 결과를 재현하고 싶습니다.
type
는 cmd.exe에 기본 제공되는 표준 명령 xxd
으로 기본적으로 cygwin과 함께 설치되지 않을 가능성이 높지만 cygwin을 설치하거나 설치 한 후에 cygwin 설치를 시작하면 cygwin에서 사용할 수있는 긴 명령 목록을 얻습니다. cygwin 설정 검색 상자에 xxd를 입력하면 나타납니다. xxd는 vim7을 설치 한 후에도 구할 수 있으므로 거기에서 구할 수도 있습니다.
c:\cygwin\bin
경우 (cygwin의 bin 서브 디렉토리가있는 경우) 경로에 추가하십시오. 또한 'type'또는 'dir'과 같은 내부 cmd 명령 또는 calc.exe (windows calculator)와 같은 외부 exe는 cygwin 내에서 실행 / 시작될 수 있습니다. cygwin에서 실행할 수있는 대부분은 cmd에서 실행할 수 있으며 그 반대도 가능합니다. bash를 사용하려면 cygwin을 사용하고 작은 따옴표와 큰 따옴표로 인해 문제가 발생하면 cygwin 내에서 cygwin 명령을 실행하고 cmd 내에서 cmd 명령을 실행하십시오.
echo 61|xxd -r -p>a.a
를 들어 시도하십시오. type a.a
따라서 실제로 xxd -p로 바이트 덤프를 가져 와서 바이트를 재 배열하거나 수정 한 다음 xxd -r -p로 피드하고 다른 인코딩으로 새 파일을 얻거나 이전 데이터를 기반으로 다른 데이터. "file"명령은 바이트를 기준으로 인코딩을 계산합니다.
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