Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 이해:문자열 인코딩, ASCII 및 유니코드

컴퓨터가 1과 0만 이해하는 세상에서 어떻게 문자열이 존재할 수 있습니까?

음...

도메인 이름을 IP 주소에 매핑할 수 있는 것처럼

또는 특정 제품에 대한 바코드입니다.

우리는...

숫자를 문자에 매핑하세요!

97처럼 "a"로 .

또는 122 "z"로 .

이것이 바로 우리가 숫자의 세계에서 문자를 가질 수 있는 방법입니다.

하지만 어떤 숫자가 어떤 문자와 어울리나요?

그 질문에 답하기 위해 우리는 다양한 문자 매핑 시스템을 발명했습니다.

ASCII로 시작

ASCII는 "정보 교환을 위한 미국 표준 코드"를 나타냅니다.

ASCII 테이블을 찾거나 Ruby에 문자를 ASCII 값으로 변환하도록 요청할 수 있습니다.

좋아요 :

"a".ord
# 97

여러 문자의 경우 :

"abc".bytes
# [97, 98, 99]

정수가 있으면 관련 문자를 얻을 수 있습니다.

좋아요 :

97.chr
# "a"

ASCII 인코딩 포함 :

  • 제어 문자(예:줄 바꿈, 탭, null)
  • 기호(예:괄호, 등호, 물음표)
  • 숫자(0-9)
  • 문자(a-z, A-Z)

이 문서의 뒷부분에서 살펴보겠지만 이 문자 범위는 제한되어 있습니다.

왜?

중국어나 일본어와 같은 다른 언어의 문자 및 기호가 포함되어 있지 않기 때문입니다.

실제 세계의 ASCII

이 전체 숫자를 문자열로 매핑하는 일이 당신을 위해 뒤에서 발생합니다.

하지만 실용적인 용도가 있습니다!

예를 들어 :

HTTP 사양은 URL 내부에 특정 문자를 허용하지 않습니다.

그러나 이러한 잘못된 문자를 ASCII 형식으로 인코딩할 수 있으며 대부분의 최신 웹 서버에서 올바르게 해석합니다.

example.com/a+++ => example.com/a%2B%2B%2B

%2B란 무엇입니까? ?

+ 문자입니다. , ASCII 인코딩 형식.

이 지식을 사용하여 캐릭터를 변형할 수도 있습니다.

예를 들어 :

ASCII 표를 보면 소문자에서 32를 빼면 대문자로 변환할 수 있음을 알 수 있습니다.

("a".ord - 32).chr
# "A"

그 반대도 마찬가지입니다.

("A".ord + 32).chr
# "a"

예.

Ruby에는 upcase가 있습니다. &downcase 방법.

그러나 이것은 인터뷰 질문, 코딩 문제 또는 유사한 상황에서 당신에게 도움이 될 수 있습니다.

유니코드란 무엇입니까?

ASCII는 최대 127개의 다른 문자(확장 ASCII의 경우 256개)까지만 인코딩할 수 있으며, 이로 인해 표현할 수 있는 문자가 제한됩니다.

해결책은?

유니코드.

유니코드는 문자열 인코딩 시스템입니다. 최대 백만 개의 다른 문자를 나타낼 수 있습니다. .

ASCII보다 훨씬 더 많은 공간이 있습니다!

이제 우리는 모든 종류의 언어, 새로운 기호 및 이모티콘까지의 문자를 포함할 수 있습니다.

다음은 유니코드입니다 :

ɑΩϕβΣπ

ASCII를 사용하여 표시할 수 없는 그리스 알파벳의 문자입니다.

루비에서 유니코드를 사용하는 방법

Ruby는 유니코드를 지원하며 Ruby 1.9부터 기본적으로 활성화되어 있습니다.

이렇게 하면 됩니다 :

π = 3.141592

또는 이것 :

def ★★★
  puts "You get 3 stars, great job!"
end

★★★
# "You get 3 stars, great job!"

꽤 재미있습니다!

그러나 이러한 기호를 사용하여 메서드와 변수를 정의하는 것은 키보드에 없기 때문에 실용적이지 않을 수 있습니다.

사실, 유효하고 보이지 않는 유니코드 문자가 있습니다.

:

def ​
  puts "Invisible method"
end
​

이것은 일반적으로 허용되지 않는 이름이 없는 메소드처럼 보입니다.

하지만 보이지 않는 유니코드 문자 때문에 작동합니다!

문자열 인코딩 방법

Ruby에는 다양한 인코딩 시스템을 사용할 수 있는 방법이 있습니다.

예를 들어 :

"abc".encoding.name
# "UTF-8"

현재 인코딩 (encoding.name )가 실제 인코딩과 일치하지 않음 문자열의.

웹사이트, 파일, 데이터베이스 또는 다른 외부 소스에서 데이터를 읽는 동안 찾을 수 있습니다.

그러면 InvalidByteSequenceError가 발생합니다. .

이 경우 인코딩을 변경해야 합니다 .

어떻게?

encode 사용 방법:

"abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace)

# "abc???"

UTF-8(유니코드)에서 변환 중입니다. ASCII로 , 그리고 Σ 때문에 ASCII에서 사용할 수 없는 문자는 Ruby에 대체하도록 지시합니다.

기본적으로 정의되지 않은 문자를 물음표로 바꿉니다.

하지만 변경할 수 있습니다.

좋아요 :

"abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "")

# "abc"

또는 '대체' 옵션 사용 :

"abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"})

# "abcEEE"

이것은 :

"UTF-8(유니코드)의 모든 문자를 ASCII로 교체하고 대체 해시를 사용하여 ASCII에 존재하지 않는 문자를 번역합니다."

다른 방법, force_encoding , 이 번역 단계 없이 인코딩을 변경합니다.

:

"abc½½½".force_encoding("iso-8859-1")

Encoding.aliases로 사용 가능한 인코딩 목록을 얻을 수 있습니다. 방법.

요약

컴퓨터가 인코딩 테이블을 사용하여 숫자에서 문자를 생성하는 방법을 배웠습니다! Ruby의 ASCII 및 유니코드에 대해서도 배웠습니다.

이제 편집기를 열고 즐겁게 연습하세요 😃

읽어주셔서 감사합니다.