바이트와 ​​문자의 차이점은 무엇입니까(적어도 *nixwise)?

바이트와 ​​문자의 차이점은 무엇입니까(적어도 *nixwise)?

나는 모든 문자가 하나 이상의 바이트로 구성된다는 것을 알고 있습니다.

내 기억이 맞다면 적어도 *nix 운영 체제에서는 문자가 일반적으로(또는 배타적으로?) 1바이트로만 구성됩니다.

바이트와 ​​문자의 차이점은 무엇입니까(적어도 *nixwise)?

답변1

POSIXly, 강조 내:

3.87 문자
시퀀스하나 이상의 바이트단일 그래픽 기호 또는 제어 코드를 나타냅니다.

실제로 정확한 의미는 실제 로케일에 따라 다릅니다. 예를 들어 "C" 로케일에서는 printf '\xc3\xa4\xc3\xb6' |wc -m바이트를 효과적으로 계산하기 때문에 4를 제공하고 UTF-8 로케일에서는 Two UTF-8 인코딩된 문자이므로 2를 제공합니다 äö. 터미널도 UTF-8로 설정되어 있다고 가정하면 물론 printf 'äö'.

( wc -c문자가 아닌 바이트 수를 계산하도록 정의되어 있어 혼동되기 쉽습니다.)

설상가상으로 문자 지원도 유틸리티에 따라 달라지며 모든 것이 멀티바이트 문자를 깔끔하게 처리하는 것은 아닙니다(유니코드의 모든 단점은 말할 것도 없고). 예를 들어, GNU tr은 매뉴얼 페이지와 상관없이 바이트를 처리합니다.

$ printf ä | tr ä xy; echo
xx
$ printf ö | tr ä xy; echo
x�

첫 번째는 와 동일 tr '\303\244' 'xy'하므로 두 바이트가 모두 ä교체되는 반면 두 번째는 두 바이트의 첫 번째 바이트가 ä동일하기 때문에 발생합니다 ö. 물론 실제로 문자를 처리한다면 해당 문자는 인쇄되어야 x하고 ö.

답변2

관례적으로 바이트는POSIX 정의여덟. 비트는 이진수입니다(즉, 기본 숫자 1또는 0거의 모든 수치 계산의 기초).

한 캐릭터는자주바이트는 일부 컨텍스트(예: ASCII)에서 바이트 길이로 정의될 수 있습니다. 그러나 유니코드, UTF-8 및 UTF-16은 단일 문자(또는 문자 모양)가 1바이트보다 긴 데이터 페이로드로 정의될 수 있는 확장 문자 집합을 정의합니다.

단일 문자:

Q̴̢̪̘̳̣̞̩̪̑̍̉̆̉͛̑̂̕͝

은 단일 문자이지만 기본 문자 모양(간단한 )에 여러 개의 악센트(또는 발음 구별 부호)를 적용하여 수행됩니다 Q. 이 인코딩은 길이보다 더 많은 바이트를 사용합니다. 해당 문자를 파일에 넣고 내 로케일에 콘텐츠를 표시하는 hexdump대신 사용하면 됩니다. cat:

$ hexdump -C demo
00000000  51 cc b4 cc 91 cc 8d cc  89 cc 86 cc 89 cd 9d cd  |Q...............|
00000010  9b cc 91 cc 95 cc 82 cc  aa cc 98 cc b3 cc a3 cc  |................|
00000020  a2 cc 9e cc a9 cc aa 0a                           |........|
00000028

답변3

바이트기본 요소로, 일반적으로 길이가 8비트입니다(라고도 함).팔중주), 다른 크기도 있었지만 아마도 여전히 있을 것입니다. 8비트 바이트를 사용하면 256개의 다른 값(0부터 255까지)을 인코딩할 수 있습니다.

문자의 경우 사용된 인코딩 및 문자 집합에 따라 상황이 달라집니다.

  • 가장 간단하고 가장 일반적인 인코딩/문자 집합은 다음과 같습니다.ASCII 코드. 모든 캐릭터가 사용하는1바이트(실제로는 그보다 적습니다. 7비트에 불과합니다). 발음 구별 부호(악센트 등)가 없는 영어 알파벳의 소문자 및 대문자, 숫자, 일반적인 구두점 및 제어 문자가 포함됩니다.

  • 그런 다음 일련의 8비트 문자 집합이 있습니다.ISO-8859시리즈, MS-DOS 및 Windows코드 페이지,맥 문자 세트, 등.

    이는 ASCII의 상위 집합(처음 128개 값은 ASCII와 동일)이고 나머지 128개 값은 로케일별 문자(악센트 문자, 그리스어 또는 키릴 문자와 같은 대체 스크립트...)용입니다.

    모든 컴퓨터가 동일한 문자 집합을 사용하는 것은 아니기 때문에 컴퓨터 간 또는 프로그램 간에 파일을 전송할 때 모든 종류의 문제가 발생할 수 있습니다.

    이 경우에는 여전히 역할이 있습니다.1바이트.

  • 이후유니코드컬렉션의 모든 것을 통합하려고 시도하는 패밀리는 분명히 256보다 크므로 단일 바이트에 들어갈 수 없습니다.

  • 처음에는 16비트이면 충분하다고 생각하여 UCS-2를 설계했습니다.2바이트문자당(이는 최대 65536개의 문자를 의미하지만 전부 할당되지는 않지만 UTF-16을 허용합니다).

  • 그러다가 2바이트가 항상 충분하지 않다는 것이 분명해졌습니다. 그래서 UTF-16이 도입되었습니다.에이전트 쌍추가 문자를 인코딩합니다. BMP(Basic Multilingual Plane) 문자의 경우 여전히 다음을 사용합니다.2바이트정확합니다. 그러나 "추가" 문자의 경우 총 2바이트씩 2개의 코드 단위를 사용합니다.4 바이트.

    UTF-16은 Windows NT 및 그 후속 버전의 기본 인코딩입니다. 그러나 UTF-16에도 문제가 있습니다. 모든 사람이 2바이트 순서(리틀 엔디안 또는 빅 엔디안)에 동의하지 않기 때문에 UTF-16LE 및 UTF-16BE가 있습니다. BOM 유무에 관계없이.

  • UCS-4 및 UTF-32도 사용됩니다.4 바이트문자당(UTF-32는 UTF-16으로 표현할 수 있는 값으로 제한됨) 있지만 이는 매우 드뭅니다.

  • UTF-8은 아마도 가장 일반적인 인코딩이 되고 있는 가변 길이 인코딩입니다. 문자는 어디에서나 인코딩될 수 있습니다.1~4바이트 사이.

    UTF-8의 장점은 유니코드의 ASCII 부분(코드 포인트 0~127)이 여전히 단일 바이트로 인코딩되고 해당 범위 밖의 코드 포인트에는 0~127 사이의 바이트가 포함되지 않는다는 점입니다. 이를 통해 경로 /(또는 \또는 :), 프로그래밍 언어 및 셸의 많은 구두점( !=+-*/^"'<>[]{}등), 제어 문자(예: CR, LF 또는 탭, 공백 등) ).

그러나 유니코드에는 추가적인 복잡성이 있습니다.코드 포인트 결합 가능. é단일 문자 é(U+00E9 LATIN SMALL LETTER E AND ACUTE)로 인코딩하거나 e(U+0065 LATIN SMALL LETTER E) 다음에 ◌́(U+0301 COMBINING ACUTE ACCENT) 로 인코딩할 수 있습니다 . 그림에서 알 수 있듯이돕고티의 답변, 한 글자에 꽤 많은 조합 기호를 쌓을 수 있습니다!

분음 부호는 코드 포인트의 유일한 조합이 아닙니다. 변형, 특히 이모티콘을 만드는 방법이 많이 있습니다. 피부색을 변경할 수 있습니다(

관련 정보