UTF-8보다 ASCII 인코딩을 선택하면 어떤 이점이 있습니까?


91

ASCII의 모든 문자는 스토리지를 늘리지 않고도 UTF-8을 사용하여 인코딩 할 수 있습니다 (둘 다 스토리지 바이트 필요).

UTF-8은 "ASCII-characters"이외의 문자 지원 이점을 제공합니다. 그런 경우에는, 우리는 왜 것 이제까지 UTF-8을 통해 ASCII 인코딩을 선택 하는가?

UTF-8 대신 ASCII를 선택할 때 유스 케이스가 있습니까?


9
레거시를 지원하기 위해 ...
fretje

9
UTF8 ASCII도 지원 한다는 의미 입니다. 따라서 레거시 기능을 지원해야하더라도 UTF8은 다른 변경이 필요하지 않습니다.
Pacerier

3
8 개의 ASCII 문자를 7 바이트로 묶는 시스템과 상호 운용해야합니까? 사람들은 물건에 맞게 미친 물건을했습니다.
Donal Fellows

4
견과라고 불러라. 그러나 나는 안전과 안정성을 말할 것이다. 멀티 바이트 시퀀스가없는 문자 세트는 나누기가 훨씬 어렵습니다. 휴먼 언어 지원이 중요한 ASCII는 잘리지 않습니다. 그러나 기본 프로그래밍을하고 컴파일러와 운영 체제가 작성된 모국어로 자신을 짜낼 수 있다면 왜 복잡성을 추가해야합니까? @ 도널 펠로우. 마지막으로 확인했습니다 ... ASCII 7 바이트입니다. (추가 비트가있는 것은 ASCII가 아니며 문제를 요구합니다)
ebyrob

2
@ebyrob 나는 Donal Fellows가 8 개의 ASCII 심볼을 7 바이트로 패킹하는 비트를 의미한다고 생각합니다. 각 심볼은 각각 7 비트를 사용하기 때문입니다 ... 8 * 7 = 56 비트 = 7 바이트. 8 개 중 1 바이트의 저장 공간을 절약하기위한 특별한 인코딩 및 디코딩 기능을 의미합니다.
dodgy_coder

답변:


83

경우에 따라 개별 문자에 대한 액세스 속도를 높일 수 있습니다. str='ABC'UTF8 및 ASCII로 인코딩 된 문자열을 상상해보십시오 (언어 / 컴파일러 / 데이터베이스가 인코딩에 대해 알고 있다고 가정)

C많은 프로그래밍 언어로 된 배열 액세스 연산자를 사용 하여이 문자열에서 세 번째 ( ) 문자에 액세스하려면 다음과 같이하십시오 c = str[2].

이제 문자열이 ASCII로 인코딩 된 경우 문자열에서 세 번째 바이트를 가져 오기만하면됩니다.

그러나 문자열이 UTF-8로 인코딩 된 경우 첫 번째 문자가 1 또는 2 바이트 문자인지 먼저 확인해야하며 두 번째 문자에 대해 동일한 검사를 수행해야하며 세 번째 문자에만 액세스 할 수 있습니다. 성능 차이가 클수록 줄이 길어집니다.

예를 들어 UTF-8로 인코딩 된 VARCHAR 뒤에 '열'이있는 열의 시작 부분을 찾을 수있는 일부 데이터베이스 엔진의 경우 데이터베이스에서 VARCHAR 필드에 몇 개의 문자가 있는지 확인해야 할뿐만 아니라 그들 각각이 사용하는 많은 바이트.


3
데이터베이스가 "문자 수" "바이트 수"를 모두 저장하지 않으면 문제가 있다고 말할 수 있습니다.
Dean Harding

1
TBH 나는 어느 데이터베이스도 저장할 데이터베이스를 모른다 ...
Mchl

@Mchl : 데이터베이스가 문자열의 끝에 도달했을 때 데이터베이스가 어떻게 알고 있다고 생각하십니까?
케빈 클라인

1
보통 0x00 또는 0x0000에 도달
Mchl

4
@DeanHarding 문자 수는 두 번째 문자가 시작되는 위치를 어떻게 알려줍니까? 또는 데이터베이스에 각 문자 오프셋에 대한 인덱스가 있어야합니까? 참고 :이 문자는 2 자만이 아니라 최대 4 자 (6이 아닌 경우)까지 입니다. stackoverflow.com/questions/9533258/… (시스템을 파괴 할 수있는 정말 긴 가증 한 것은 utf-16 뿐이라고 생각합니다)
ebyrob

7

UTF-8의 US-ASCII (또는 ISO 646) 서브 세트 만 사용하려는 경우에는 서로에게 실질적인 이점이 없습니다. 실제로 모든 것이 동일하게 인코딩됩니다.

US-ASCII 문자 세트를 넘어서 전형적인 서유럽 언어로 사용되는 악센트, 움라우트 등의 문자를 사용하는 경우 (예 :) 차이가 있습니다. ISO 8859에서 단일 바이트로 인코딩되지만 UTF-8로 인코딩 된 경우 둘 이상의 바이트가 필요합니다. ISO 8859은 당신이 밴드 중 일부는 사용되는 인코딩을 지정하는 것을 의미한다 사용하는 것이 필요하며, 그것은 단지 지원이 단점은 물론, 또한 하나한 번에 이러한 언어의. 예를 들어, 키릴 문자 (러시아어, 벨로루시 아어 등) 알파벳의 모든 문자를 1 바이트 만 사용하여 인코딩 할 수 있지만 프랑스어 나 스페인어 문자 (미국 -ASCII 이외의 문자)와 혼합해야하는 경우 / ISO 646 하위 집합) 운이 좋지 않습니다. 문자 세트를 완전히 변경해야합니다.

ISO 8859는 실제로 유럽 알파벳에만 유용합니다. 대부분의 중국어, 일본어, 한국어, 아라비아 등의 알파벳에 사용되는 대부분의 알파벳을 지원하려면 완전히 다른 인코딩을 사용해야합니다. 이들 중 일부 (예 : 일본어의 경우 JIS JIS)는 처리해야 할 절대적인 고통입니다. 당신이 그들을 지원하고 싶을 가능성이 있다면, 만약을 위해 유니 코드를 사용하는 것이 가치 있다고 생각합니다.


5

ANSI는 여러 가지 일 수 있으며, 대부분 Windows 8의 경우 코드 페이지 1252와 같이 8 비트 문자 세트입니다.

아마도 당신은 7 비트 ASCII 및 UTF-8의 적절한 서브 세트 인 ASCII를 생각하고 있었을 것입니다. 즉, 유효한 ASCII 스트림도 유효한 UTF-8 스트림입니다.

8 비트 문자 집합을 생각할 때 매우 중요한 장점 중 하나는 표현 가능한 모든 문자가 정확히 8 비트이며 UTF-8에서 최대 24 비트 일 수 있다는 것입니다.


예, 7 비트 ASCII 세트에 대해 이야기하고 있습니다. 우리가 utf-8 대신에 ascii로 저장해야 할 이점 하나를 생각할 수 있습니까? (7- 비트는 어쨌든 8- 비트로 저장되므로, 파일 크기는 정확히 동일합니다)
Pacerier

1
유니 코드 값 127보다 큰 문자가 있으면 ASCII로 저장할 수 없습니다.

1
@Pacerier : 모든 ASCII 문자열은 UTF-8 문자열 이므로 차이없습니다 . 인코딩 속도는 사용하는 플랫폼의 문자열 표현에 따라 더 빠를 있지만 상당한 속도 향상을 기대하지는 않지만 유연성이 크게 저하됩니다.
back2dos

@ 그렇기 때문에 ASCII로 저장하면 어떤 이점이 있는지 묻습니다.
Pacerier

5
@Pacerier, XML을 ASCII로 저장하는 경우 & # 160; 깨지지 않는 공간. 이것은 더 채우지 만 데이터는 ISO-Latin-1 vs UTF-8 인코딩 오류에 대해 더 저항력이 있습니다. 기본 플랫폼이 캐릭터와 함께 보이지 않는 많은 마법을 수행 할 때 우리가하는 일입니다. ASCII를 유지하면 데이터가 더욱 강력 해집니다.

3

예, ASCII가 의미있는 사용 사례가 여전히 있습니다 : 파일 형식네트워크 프로토콜 . 특히 다음과 같은 용도로 사용됩니다.

  • 컴퓨터 프로그램에 의해 생성되고 소비 된 데이터는 최종 사용자에게 제공되지 않습니다.
  • 그러나 프로그래머가 쉽게 개발하고 디버깅 할 수 있도록 읽는 것이 유용합니다.

ASCII를 인코딩으로 사용하면 사람이 읽을 수있는 수준을 유지하면서 멀티 바이트 인코딩의 복잡성을 피할 수 있습니다.

몇 가지 예 :

  • HTTP 는 8 진수 시퀀스로 정의 된 네트워크 프로토콜이지만 "GET", "POST", "Accept-Language"및 곧.
  • PNG 이미지 형식청크 유형 은 4 개의 8 진수로 구성되지만 IDAT"이미지 데이터"를 PLTE의미하고 "팔레트" 를 의미 하는 PNG 인코더 또는 디코더를 프로그래밍하는 경우 유용합니다 .

물론 데이터가 실제로 최종 사용자에게 표시 되지 않도록주의해야합니다 .URL의 경우처럼 데이터가 표시되면 사용자는 데이터가 올바르게 표시되기를 기대하기 때문입니다. 읽을 수있는 언어로.


잘했다. 지구상에서 가장 많은 유니 코드를 전송하는 프로토콜 인 HTTP 만 ASCII 만 지원하면된다는 것은 조금 아이러니합니다. (실제로 TCP와 IP, 이진 지원, ASCII 지원에
대해서도 마찬가지

2

우선, 제목은 / d ANSI를 사용하지만 텍스트에서는 ASCII를 나타냅니다. ANSI는 ASCII와 같지 않습니다. ANSI는 ASCII 세트를 통합합니다. 그러나 ASCII 세트는 처음 128 개의 숫자 값 (0-127)으로 제한됩니다.

모든 데이터가 ASCII (7 비트)로 제한되는 경우 ANSI 및 UTF-8이 전체 ASCII 세트를 통합하므로 UTF-8, ANSI 또는 ASCII를 사용하는지 여부는 중요하지 않습니다. 즉, 0에서 127까지의 숫자 값은 ASCII, ANSI 및 UTF-8에서 정확히 동일한 문자를 나타냅니다.

ASCII 집합 이외의 문자가 필요한 경우 인코딩을 선택해야합니다. ANSI를 사용할 수는 있지만 다른 모든 코드 페이지의 문제가 발생합니다. 머신 A에서 파일을 작성하고 머신 B에서 파일을 읽으면이 코드 페이지에서 숫자 값 nnn이 다른 문자를 나타 내기 때문에이 코드가 다른 코드 페이지를 사용하도록 설정된 경우 재미있는 텍스트를 생성 할 수 있습니다.

이 "코드 페이지 지옥"은 유니 코드 표준 이 정의 된 이유 입니다. UTF-8은 해당 표준의 단일 인코딩이지만 더 많은 것이 있습니다. UTF-16은 Windows의 기본 인코딩이므로 가장 널리 사용됩니다.

따라서 ASCII 세트의 128 자 이상을 지원해야하는 경우 UTF-8을 사용하는 것이 좋습니다. 그렇게하면 문제가되지 않으며 사용자가 시스템을 설정 한 코드 페이지에 대해 걱정할 필요가 없습니다.


128자를 초과하여 지원할 필요가없는 경우 UTF8 인코딩보다 ACSII 인코딩을 선택하면 어떤 이점이 있습니까?
Pacerier

128 자로 제한하는 것 외에도? 별로. UTF-8은 ANSI 만 필요로하는 ASCII 및 대부분의 서구 언어를 지원하도록 특별히 설계되었습니다. UTF-8은 하나 이상의 바이트로 비교적 적은 수의 상위 ANSI 문자 만 인코딩한다는 것을 알 수 있습니다. 대부분의 HTML 페이지가 UTF-8을 기본값으로 사용하는 이유가 있습니다.
Marjan Venema

1
@Pacerier, 127보다 큰 인코딩이 필요하지 않은 경우 UTF를 추가 문자로 간주하여 동일한 문자로 간주하려면 추가 비트 확인이 필요하기 때문에 일부 API를 사용하여 인코딩 / 디코딩 할 때 ASCII를 선택하는 것이 좋습니다. 순수한 ASCII는 검증없이 8 비트를 읽습니다. 그러나 대규모 (대형) 계산에서 높은 수준의 최적화가 필요하고 해당 최적화에서 수행중인 작업을 알고있는 경우에만 ASCII를 사용하는 것이 좋습니다. 그렇지 않은 경우 UTF-8을 사용하십시오.
Luciano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.