2010-08-01 6 views
0

io.WriteString을 사용하여 연결에 문자열을 쉽게 쓸 수 있습니다.Go를 사용하여 연결에서 utf8 인코딩 된 데이터 읽기

그러나 쉽게 볼 수 없습니다. 문자열을 연결로 읽습니다. 연결에서 읽을 수있는 유일한 것은 바이트이며, 나는 어떻게 든 문자열로 변환해야합니다.

바이트가 utf8로 인코딩 된 문자열을 나타내는 것으로 가정하면 어떻게 문자열 형식으로 변환하겠습니까?

(편집 : 대안 어떻게 단순히 연결에서 문자열을 읽을 수)

감사합니다!

답변

2

당신은 문자열로 바이트의 조각을 캐스팅 할 수 있습니다 문자열이 단지 바이트의 배열로 취급되기 때문에

var foo []byte 
var bar string = string(foo) 

는 관련 디코딩에는 인코딩 /이 없습니다.

+0

충분히 가까이 있지만 사실은 아닙니다. 문자열은 바이트 배열과 다르게 처리됩니다. – cthom06

+0

호기심, 문자열 끝 (또는 끝 문자) 도달 시점을 확인하는 방법? 또는 char (캐스팅 사용)을 통해 연결에서 문자열을 작성할 수 있습니까? – helios

4

목적에 맞는 편리한 도구는 표준 라이브러리 bytes.Buffer (see the package docs)에서 찾을 수 있습니다.

io.Reader을 구현하는 개체가 있다고 가정 해보십시오. 즉, Read([]byte) (int, os.Error)이라는 서명이있는 메서드가 있다고 가정 해 보겠습니다.

일반적인 예

가있는 os.File : 당신은 단순히 bytes.Buffer (그 제로 가치를 창출, 문자열로 해당 파일의 내용을 읽고 싶다면

f, err := os.Open("/etc/passwd", os.O_RDONLY, 0644) 

은 즉시 사용 가능한 버퍼이다, 그래서 당신은) 생성자를 호출 할 필요는 없다 :

var b bytes.Buffer 

사용 io.Copy을 버퍼에 파일의 내용을 복사 :

n, err := io.Copy(b, f) 

s := b.String() 

:

그리고 문자열로 버퍼의 내용을 검색 할 버퍼의 문자열 메소드를 호출 -

(. 그들은 더 많거나 적은 같은 것 io.Copy를 사용하는 대신 b.ReadFrom(f) 것) bytes.Buffer은 자동으로 파일의 내용을 저장하기 위해 자랄 것이므로 byte 슬라이스 등을 할당하고 늘리는 것에 대해 걱정할 필요가 없습니다.

관련 문제