2016-09-29 1 views
2

에 UTF-16LE 비약의 비트 열 변환 :이 읽을 수있는 비약 문자열로 변환 얻을 수있는 방법로 인코딩 엘릭서의 비트 열을 감안할 때 엘릭서 문자열

<<68, 0, 101, 0, 118, 0, 97, 0, 115, 0, 116, 0, 97, 0, 116, 0, 111, 0, 114, 0, 0, 0>> 

(그것은 "버스 테이터"을 주문) ? 가장 가까운 것은 위 코드를 유니 코드 코드 포인트 (["0044", "0065", ...])의 목록으로 변환하고 \u 이스케이프 시퀀스를 앞에 추가하려고 시도했지만 엘 릭시 스는 유효하지 않은 시퀀스이므로 오류가 발생합니다. 나는 아이디어가 없어.

+0

당신 ' 이미 [대답] (http://stackoverflow.com/a/39601246/3102718)이 질문에 맞습니까? –

+0

이것은 일시적인 해킹이었으며보다 복잡한 상황의 경우 null 바이트로 끝나는 알려지지 않은 길이의 문자열을 파싱하면 충분하지 않습니다. – user701847

+0

알았어, 고마워, 그냥 궁금해서. –

답변

5

가장 간단한 방법은 사용 기능 :

:unicode.characters_to_binary(utf16binary, {:utf16, :little}) 

예 :

<<68, 0, 101, 0, 118, 0, 97, 0, 115, 0, 116, 0, 97, 0, 116, 0, 111, 0, 114, 0, 0, 0>> 
|> :unicode.characters_to_binary({:utf16, :little}) 
|> IO.puts 
#=> Devastator 

(대신 문자열의 바이너리 표시가 쉘에 사용되며, OS에 따라서는 널 (null) 바이트에 대한 몇 가지 추가 표현을 인쇄 할 수 있도록 매우 끝에 null 바이트가있다)

+0

아, 와우 ... 나는 실제로 보았다. Erlang 라이브러리에서, 특히 그 중 어떤 것이 나를 돕는 지 알아보기 위해서'바이너리'를 사용하지만, 페이지를 아래로 내려보고 유니 코드를 보는 것을 완전히 무시했다 ... 감사합니다! – user701847

+1

이것은 좋은 일입니다! 나는': unicode.characters_ *'함수도 바이너리를 사용할 수 있는지 몰랐다. @ user701847 아마도 내 답변 대신이 대답을 받아 들여야합니다. – Dogbert

1

당신은 특별히 <<codepoint::utf16-little>>, 비약의 패턴 매칭을 사용할 수있다 :

defmodule Convert do 
    def utf16le_to_utf8(binary), do: utf16le_to_utf8(binary, "") 

    defp utf16le_to_utf8(<<codepoint::utf16-little, rest::binary>>, acc) do 
    utf16le_to_utf8(rest, <<acc::binary, codepoint::utf8>>) 
    end 
    defp utf16le_to_utf8("", acc), do: acc 
end 

<<68, 0, 101, 0, 118, 0, 97, 0, 115, 0, 116, 0, 97, 0, 116, 0, 111, 0, 114, 0, 0, 0>> 
|> Convert.utf16le_to_utf8 
|> IO.puts 

<<192, 3, 114, 0, 178, 0>> 
|> Convert.utf16le_to_utf8 
|> IO.puts 

출력 : :unicode 모듈에서

Devastator 
πr² 
+1

아, 그게 내가 놓친거야, 고마워! 나는'codepoint'를 가져 본 적이 없으며'codepoint :: utf8'와 같이 매칭했습니다. 나는 기본적으로 2 바이트로 무엇을 해야할지 몰랐다. 좀 더 간단하게하기 위해 다음과 같이 할 수 있습니다 :'<< codepoint :: utf16-little <- binary >>, : "", do : << codepoint :: utf8>' – user701847