base128이 사용되지 않는 이유는 무엇입니까? [닫은]


90

웹에서 바이너리 데이터를 전송하는 데 base128 대신 base64 만 사용하는 이유는 무엇입니까? ASCII 문자 집합에는 이론적으로 기본 128을 나타낼 수있는 128 개의 문자가 있지만 대부분의 경우 base64 만 사용하고 base128은 사용하지 않습니다.


60
256을 기본으로하지 않는 이유는 무엇입니까?
Gumbo

22
요점은 인쇄 가능한 문자 를 갖는 것입니다 (64 개 이상의 문자도 있지만 ...)
Felix Kling

29
나는 base 128이 얼마 전에 우리 소유라고 생각합니다. 가드베이스 64에 배정 된 팀은 여전히 ​​버티고 있습니다.
Ritch Melton

5
이 질문은 자바 스크립트와 관련된 이유는 무엇입니까? 이것은 웹에서 사용되는 대부분의 다른 언어에도 해당되지 않습니까?
Benedikt Waldvogel

5
@KenRockot : 15 비트 문자 중 일부가 3 바이트로 인코딩된다는 것을 알고 있습니다. base-2048 인코딩은 11 비트를 2 바이트로 압축하여 바이트 당 5.5 비트를 만듭니다. 이는 base-64보다 절반이 적습니다.
maaartinus

답변:


105

문제는 ASCII 문자 집합의 최소 32 자 이상이 수신 단말기에서 해석 할 수있는 '제어 문자'라는 것입니다. 예를 들어, 수신 터미널을 울리는 BEL (종) 문자가 있습니다. SOT (전송 시작) 및 EOT (전송 종료) 문자는 이름이 의미하는 바를 정확히 수행합니다. 데이터 구조가 스트림으로 직렬화 / 평탄화되는 방식에서 특별한 의미를 가질 있는 CR 및 LF 문자를 잊지 마십시오 .

Adobe 는 ASCII 문자 집합에서 더 많은 문자를 사용하기 위해 Base85 인코딩 을 만들었지 만 AFAIK는 특허로 보호됩니다.


7
Base91은 좋은 오픈 소스 옵션처럼 보입니다 : base91.sourceforge.net
Jorge Cevallos

2
2의 거듭 제곱이 바이트 데이터에 더 쉽게 맞고 인코딩이 더 간단하다는 점을 고려할 가치가 있습니다. 그렇다면 이식성이 있습니다. 모든 언어에는 base64 인코딩 및 / 또는 base64 디코딩이 있습니다.
Lodewijk

5
Re Base85 및 Adobe : 특허 번호와 부여 연도를 인용하면 답변이 더 유용해질 수 있습니다. 특허가 문제라면 btoa1990 년부터 시작된 특허는 특허에 의해 방해받지 않으며 어쨌든 확실히 만료 될 것입니다.
agc

65

128 개 문자 중 일부는 인쇄 할 수 없기 때문입니다 (주로 코드 포인트 0x20 미만에있는 문자). 따라서 와이어를 통해 문자열로 안정적으로 전송할 수 없습니다. 또한 코드 포인트 128 이상으로 이동하면 시스템간에 사용되는 다른 인코딩으로 인해 인코딩 문제가 발생할 수 있습니다.


8
: Base94는 모두 94 개 인쇄 가능한 ASCII 문자 사용, github에 여기에 존재 gist.github.com/iso2022jp/4054241을
intrepidis

15

다른 답변에서 이미 언급했듯이 핵심은 문자 집합을 인쇄 가능한 것으로 줄이는 것입니다. 더 효율적인 인코딩 체계는 basE91입니다 . 더 큰 문자 집합을 사용하고 낮은 ASCII 범위의 제어 / 공백 문자를 여전히 사용하지 않기 때문입니다. 이 웹 페이지에는 바이너리 대 base64 대 basE91 인코딩 효율성 의 멋진 비교가 포함되어 있습니다 .

한 번 Java 구현을 정리했습니다. 사람들이 관심이 있다면 GitHub에 게시 할 수 있습니다.

업데이트 : 이제 GitHub에 있습니다 .


나는 자바 버전에 관심이있을 것입니다
Michael Deardeuff


12

처음 32 개의 문자가 제어 문자라는 것은 128 문자를 얻기 위해 사용할 필요가 없기 때문에 전혀 관련성이 없습니다. 선택할 수있는 256 개의 문자가 있으며 처음 32 개만 제어 문자입니다. 그러면 192자가 남으므로 제어 문자를 사용하지 않고도 128자가 완전히 가능합니다.

그 이유는 다음과 같습니다. 동일하게 보이고 어디에 있든 복사하여 붙여 넣을 수있는 무언가 여야합니다. 따라서 포럼, 채팅, 이메일 등에 동일하게 표시 될 문자 여야합니다. 즉, 포럼 / 채팅 / 이메일 클라이언트가 일반적으로 서식 지정 또는 무시에 사용할 수있는 문자를 사용할 수 없습니다. 또한 글꼴, 언어 및 지역 설정에 관계없이 동일한 문자 여야합니다.

그것이 이유입니다!


7
제어 문자는 거의 모든 사람들이 이미 코드 페이지 / 인코딩 중립적이어야한다는 점을 이미 가정하고 있기 때문에 관련이 있습니다. 따라서 대부분의 관련 인코딩의 하위 집합 인 (7 비트) ASCII로만 제한됩니다. 또한 모든 인터넷이 8 비트 깨끗한 것은 아니며 대부분은 사실상 ASCII입니다. 그래도 당신의 요점은 가치가 있습니다.
Tim Seguine 2014

7
추가하기 : ASCII는 128 자만 정의합니다. # 128에서 # 255까지의 문자 는 ASCII로 정의 되지 않습니다 . 질문이 "8 비트 인코딩"이 아닌 ASCII를 명시 적으로 참조하므로 모든 답변은 ASCII 집합의 128 자로 제한됩니다.
pepoluan

가장 일반적인 UTF-8 인코딩을 예로 사용하면 128에서 196까지의 바이트는 즉시 UTF8 디코딩 오류를 발생시킵니다. 196에서 256까지의 바이트는 다음 바이트도 동일한 문자임을 의미하지만 다음 바이트가 128 미만이면 UTF8 디코딩 오류가 다시 발생합니다. 그러나 거의 모든 문자 인코딩에 민감한 언어는 base64 라이브러리가 base64 문자열을 UTF8 안전 문자열로 사용합니다. base128은 UTF8 안전 문자열로 인코딩 할 수 없기 때문에 동일한 작업을 수행 할 수 없습니다.
대한 sofe

10

Base64는 다양한 문제를 해결하기 때문에 일반적입니다 (생각할 수있는 거의 모든 곳에서 작동 함).

  • 전송이 8 비트 클린 인지 아닌지 걱정할 필요가 없습니다.

  • 인코딩의 모든 문자를 인쇄 할 수 있습니다. 당신 그들을 수 있습니다. 당신은 할 수 복사 및 붙여 넣기 를. URL (특정 변형)에서 사용할 수 있습니다. 기타

  • 고정 인코딩 크기. 당신은 알고 m바이트로 인코딩 항상 할 수있는 n바이트.

  • 모두가 그것에 대해 들어 봤습니다-널리 지원되고 많은 라이브러리가 상호 운용하기 쉽습니다.

Base128에는 이러한 모든 이점이 없습니다.

8 비트 깨끗한 것처럼 보이지만 base64는 65 개의 기호를 사용합니다. 대역 외 문자가 없으면 고정 된 인코딩 크기의 이점을 누릴 수 없습니다. 대역 외 문자를 사용하는 경우 더 이상 8 비트를 깨끗하게 할 수 없습니다.

그래도 모두 부정적인 것은 아닙니다.

  • base128은 base64보다 인코딩 / 디코딩이 더 쉽습니다. 시프트와 마스크 만 사용하면됩니다. 임베디드 구현에 중요 할 수 있음

  • base128은 사용 가능한 비트를 더 많이 사용하여 base64보다 전송을 약간 더 효율적으로 사용합니다.

사람들 base128을 사용합니다-나는 지금 그것을 사용하고 있습니다. 그것은 흔하지 않습니다.


또한 메일 / 뉴스 시스템과 해당 ilk (및 XML)가 항상 처음 32 개의 코드 포인트 (예를 들어 CR LF 대 LF를 고려)에 친절하지는 않지만 그렇지 않은 경우 답변이 매우 좋아 보입니다.
SamB

"base64는 65 개의 기호를 사용합니다." => 오타 또는 내가 놓친 것이 있습니까?
Kikiwa

@Kikiwa, wikipedia 에서이 자바 샘플을 보세요 . CODES변수 의 길이를 확인하십시오 .
John La Rooy

네, 인코딩 페이로드 끝에 만 패딩 문자 '='가 있습니다. 맞습니다. 감사합니다.
Kikiwa

4

확실하지는 않지만 낮은 값 (제어 코드 등을 나타냄)은 HTTP 요청 / 응답 내부의 텍스트 / 문자로 안정적으로 전송되지 않는다고 생각하며 127 이상의 값은 로케일 / 코드 페이지 / 무엇이든 특정 일 수 있으므로 그렇지 않습니다. 모든 브라우저 / 플랫폼에서 작동 할 것으로 예상되는 128 개의 다른 문자.


3

이사지가 맞아요. Base64는 텍스트 만 필요한 프로토콜을 사용하여 전송을 위해 이진 데이터를 인코딩하는 데 사용됩니다. 그것은에 맞아 위키 항목.


2

base128 PHP-Class를 확인하십시오. ISO 8859-1 문자 세트로 인코딩 및 디코딩.

GoogleCode PHP-Class Base128


1
난 ... 대신 UTF-8을 사용하고자하는
야누스 Troelsen에게

1
기본 인코딩은 기본 데이터와 관련이 없습니다. 텍스트 / 데이터를 인코딩하기 위해 원하는 텍스트 인코딩을 사용할 수 있습니다. 그가 의미하는 바는 Base ## 인덱스 테이블이 ISO 8859-1 ASCII 문자 세트를 번역으로 사용한다는 것입니다.
Chad

1
텍스트에 기본 인코딩 된 이진 데이터 를 포함 하려고하면 바로 기본 데이터와 관련이 있습니다 . 해당 텍스트가 다른 인코딩으로 인코딩 된 경우 문제가 발생합니다.
Stijn de Witt

"ISO 8859-1 ASCII"문자 세트와 같은 것은 없습니다. 이 프로그램은 128 개의 인쇄 가능한 ISO 8859-1 문자를 사용하여 데이터를 인코딩합니다. 어떤 식 으로든 모양이나 형태로 ASCII를 사용하지 않습니다 .
Nisse Engström
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.