2012-11-22 3 views
12

ISO 8859-1 인코딩 된 문자열을 UTF-8로 변환하려고합니다.golang iso8859-1 to utf8

다음 함수는 독일어 움라우트가 포함 된 testdata에서 작동하지만 rune (b) 캐스트가 가정 한 소스 코드가 무엇인지는 잘 모릅니다. 일종의 기본 인코딩 (예 : ISO8859-1 또는 사용할 인코딩을 지정하는 방법이 있습니까?

func toUtf8(iso8859_1_buf []byte) string { 
    var buf = bytes.NewBuffer(make([]byte, len(iso8859_1_buf)*4)) 
    for _, b := range(iso8859_1_buf) { 
     r := rune(b) 
     buf.WriteRune(r) 
    } 
    return string(buf.Bytes()) 
} 
+1

그런데, 당신은 iso8859-1을 의미합니까? – ANisus

+0

예, 혼란에 대해 유감스럽게 생각합니다. – zeroc8

답변

12

INT32 는 별칭이며,이 부호화에 관해서, 룬 유니 코드 문자 값 (코드 포인트)를 갖는 것으로 가정된다. 따라서 b의 값은 rune(b)이며 유니 코드 값이어야합니다. 0x00 - 0xFF의 경우이 값은 Latin-1과 동일하므로 걱정할 필요가 없습니다.

그런 다음 룬 문자를 UTF8로 인코딩해야합니다. 그러나이 인코딩은 []runestring으로 변환하면됩니다.

func toUtf8(iso8859_1_buf []byte) string { 
    buf := make([]rune, len(iso8859_1_buf)) 
    for i, b := range iso8859_1_buf { 
     buf[i] = rune(b) 
    } 
    return string(buf) 
} 
+0

나는 0x7f까지의 값만이 같다고 지적했다. – zeroc8

+2

유니 코드와 Latin-1의 값은 동일합니다 (Latin-1은 유니 코드의 0x00 - 0xFF 하위 집합으로 간주 될 수 있음). 그러나 값을 저장할 때 Latin-1은 1 바이트 (예 :'0x41')를 사용하고 유니 코드는 4 바이트 (예 :'0x00000041')를 사용합니다. 혼란 스러울 수있는 것은 UTF-8 인코딩입니다 (단 하나의 바이트를 사용하여 Latin-1과 같은 방식으로 0x00 - 0x7F 만 인코딩됩니다). – ANisus

+0

UTF-8 코드 포인트가 존재하지 않습니다. UTF-8 코드 단위를 의미합니까? –

2

r := rune(expression) 

의 효과가있다 :

  • rune (별명 변수 r 선언

    는 바이트 패키지를 사용하지 않고 함수의 예이다 int32의 경우).
  • exp3 값으로 변수 r을 초기화합니다.

인코딩이 필요없고 선택적으로 사용해야하는지 말하는 것은 명시 적으로 코드에서 일부 재 인코딩을 작성/처리해야 가능합니다. 다행스럽게도이 경우에는 다시 인코딩 할 필요가 없습니다. 유니 코드는 ISO 8859-1의 코드를 ASCII와 비슷한 방식으로 통합했습니다. (내가 정확하게 체크했다면 here)

+0

재 부호화가 필요합니다. ö와 같은 문자는 같은 방식으로 인코딩되지 않습니다. 'latin1 = [] byte {0x52, 0xE4, 0x76} '바이트 문자열을 가지고 있다면 잘 변환되지 않습니다. (Latin-1의 * Räv *) – ANisus

+2

하지만 0xE4는 ISO 8859-1의 'ö'이 아니라 'ä'입니다. http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout. 그것을 여기에서 점검해라 : http://play.golang.org/p/s4TfzJUa7m – zzzz

+0

아아아, 나는 내가 오해했다라고 생각한다. Latin-1과 Unicode간에 재 인코딩이 필요 없다는 것은 사실입니다. 예, 바이트 시퀀스에 Räv가 표시됩니다. – ANisus