Ruby에서 "UTF-8의 잘못된 바이트 시퀀스"오류 해결

여기에 착륙했다면 프로그램에서이 메시지를 받았다는 의미입니다. 이 글에서는“UTF-8 바이트 시퀀스”가 무엇인지, 왜 유효하지 않을 수 있는지, 루비에서이 문제를 해결하는 방법을 빠르게 소개하겠습니다.

UTF-8 및 기타 인코딩에 대한 간략한 소개

UTF-8은 Wikipedia에 설명 된대로 코드 포인트 집합입니다 (단순한 단어로 : 문자를 나타내는 숫자). UTF-8의 모든 문자 는 1 ~ 4 바이트 의 시퀀스 입니다.

UTF-8 외에도 ISO-8859–1 또는 Windows-1252 와 같은 다른 인코딩도 있습니다. 프로그래밍 경력에서 이전에 이러한 이름을 본 적이있을 것입니다. 이러한 인코딩은 특수 라틴 문자 등을 포함하여 큰 문자 집합을 포함합니다.

이제 UTF-8이 거대한 문자 집합을 포함하더라도 위에서 언급 한 인코딩과 100 % 호환되지는 않습니다. 다음 그림을보십시오.

  • UTF-8과 ISO-8859–1은 모두 ASCII와 호환됩니다. 숫자와 라틴 알파벳에 대해 동일한 코드 포인트를 포함합니다.
  • UTF-8에는 로켓 이모티콘과 같이 ISO-8859–1에없는 문자가 포함됩니다 🚀
  • UTF-8 및 ISO-8859–1에는 모두 "Å"문자가 포함되지만 이러한 문자는 UTF-8의 c385 및 ISO-8859–1의 c5 와 같은 다른 코드 포인트를 사용하여 정의됩니다.
인코딩 호환성

2.0 이후 Ruby의 기본 인코딩은 UTF-8입니다. 즉, 루비는 사용자가 입력 한 문자열이 다르게 인코딩되었음을 명시 적으로 알리지 않는 한 UTF-8 인코딩 문자열로 취급합니다.

Å이 문제를 제시하기 위해 소개 다이어그램 의 캐릭터를 사용합시다 . file.txt다음 문자열을 포함 하는 파일이 있다고 가정하십시오 "vandflyver \xC5rhus".. 이미 알고 있듯이 C5코드 포인트 ÅISO-8859-1 에 해당 하며 UTF-8 인코딩에는 존재하지 않습니다. 그러나 Ruby는 파일의 원래 인코딩이 ISO-8859-1이라는 것을 알지 못하며 기본적으로 UTF-8로 해석합니다.

따라서 다음 작업은 악명 높은 "UTF-8 유효하지 않은 바이트 시퀀스"가됩니다.

여기에서 "유효하지 않은 UTF-8 바이트 시퀀스"는 UTF-8에없는 "Å"(C5) 문자입니다. 다행히이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

해결 방법 1 — 소스 인코딩 제공

파일이 원래 작성된 인코딩을 알고있는 경우 입력 파일을 읽을 때 인코딩 이름을 제공하기 만하면됩니다. Ruby는 자동으로 문자 변환을 처리합니다.

마지막 줄에서는 String.unpack 메서드를 사용하여 변환 된 문자의 코드 포인트를 인쇄했습니다. 당신이 볼 수 있듯이 그것은 정확하게 변환되었다 C5C385🎉

솔루션 2 — String.encode방법

대부분의 경우 파일의 원래 인코딩을 아는 것은 운이 좋지 않을 것입니다. 이 경우 String.encode 메서드가 유용합니다. 이를 사용하여 잘못된 UTF-8 문자를 건너 뛰거나 원하는 문자열로 바꿀 수 있습니다.

다음 예를 확인하십시오.

아름답지는 않겠지 만 앱을 다운시키는 것보다는 낫죠?

해결 방법 3 — 소스 인코딩 감지

소스 인코딩을 모르고 유효하지 않은 문자를 건너 뛰고 싶지 않은 경우 charlock_holmes 라는 문자 인코딩 감지 젬을 사용할 수 있습니다 . 문자열을 분석하고 가장 가능성있는 소스 인코딩과 추측 신뢰도를 제공합니다 (또한 보너스로 언어 코드도 제공합니다. : P).

실제로 확인하십시오.

요약

우선이 게시물이 루비 문제를 해결하는 데 도움이 되었기를 바랍니다. 다른 한편으로 나는 당신이 유용한 것을 배웠다고 확신합니다. 문자열 인코딩은 때때로 정말 망가질 수 있으므로 내부에서 무슨 일이 일어나고 있는지 아는 것이 정말 가치가 있습니다.

원래 https://dev.to/bajena/solving-invalid-byte-sequence-in-utf-8-errors-in-ruby-1f27에 게시되었습니다 .

Suggested posts

늦은 밤 고백 — Rust, Rocket, Diesel 및 Askama를 사용하여 웹 사이트 구축 — 1 부

늦은 밤 고백 — Rust, Rocket, Diesel 및 Askama를 사용하여 웹 사이트 구축 — 1 부

오전 1시 (🎵 부드러운 재즈 음악)입니다. 당신은 잠을 자려고 침대에 누워 있습니다.

튜토리얼 : Rasa를 사용한 NVIDIA Jarvis Virtual Assistant

튜토리얼 : Rasa를 사용한 NVIDIA Jarvis Virtual Assistant

그리고이 옵션이 생각보다 더 쉽게 접근 할 수있는 이유. 소개 음성 인터페이스가있는 가상 도우미를 개발하려면 네 가지 핵심 요소가 필요합니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.