2015-03-08 10 views
5

Tôi đang sử dụng một API và nó trở về một cái gì đó như thế này cho văn bản ngôn ngữ khác "= UTF 8 ..?":Chuyển đổi (RFC 2047) thành một chuỗi thường xuyên trong golang

=?UTF 8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF 8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF 8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF 8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=

Is đây là một định dạng phổ biến? Làm thế nào tôi sẽ đi về việc chuyển đổi này thành một chuỗi thông thường trong golang?

Golang thường xử lý nhiều ngôn ngữ tốt, nhưng tôi không chắc chắn về cách chuyển đổi.

Trả lời

6

Một cách riêng biệt, API của bạn sẽ trả về dữ liệu được mã hóa theo số RFC 2047 format. Về cơ bản, điều này xác định như sau:

encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" 

Điều này có nghĩa bộ ký tự của bạn là UTF-8 (rất tiện dụng vì đây là bộ ký tự gốc của Go) và mã hóa của bạn là Base64. Văn bản bạn phải giải mã là văn bản giữa "B?" và "? =". Vì vậy, tất cả những gì bạn phải làm là lấy văn bản đó và gọi:

base64.StdEncoding.DecodeString(text) 

để nhận chuỗi UTF-8 gốc.

Có một chức năng decodeRFC2047Word() trong gói net/mail của stdlib Go, hỗ trợ mã hóa BQ và bảng mã UTF-8, US-ASCIIISO-8859-1. Đáng tiếc là nó không xuất khẩu, nhưng bạn đang miễn phí để có càng nhiều cảm hứng từ nó khi bạn cần;)

BTW: Tôi chỉ nhận thấy các charset trong ví dụ chuỗi của bạn là UTF 8, đó là một chút kỳ quặc, kể từ khi tên chính thức của mã hóa là UTF-8.

+0

Nó đã dấu gạch ngang, nó đã được gỡ bỏ trong một các bước xử lý của tôi. – John

+0

* đã xóa nhầm – John

2

Từ Go 1.5 bạn có thể sử dụng mime.WordDecoder.DecodeHeader:

package main 

import (
    "fmt" 
    "mime" 
) 

func main() { 
    dec := new(mime.WordDecoder) 
    header, err := dec.DecodeHeader("=?UTF-8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF-8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF-8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF-8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=") 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(header) 
    // Output: لخطوات التي تجمع بين حفظ القرآن الكريم وفهمه مما أملاه العلامة عبد الله الغديان.pdf 
} 

Nếu bạn đang sử dụng một phiên bản cũ của Go, bạn có thể sử dụng thư viện thay thế của tôi: https://github.com/alexcesaro/quotedprintable

Các vấn đề liên quan