2016-12-01 2 views
0

Gmailのhtmlメールの行に2つのスペースを入力すると、メールのソースを見るとquoted-printable本体に「= C2 = A0」とエンコードされます。このstackoverflowの答えによるとGolangでquoted-printableメールをデコードする

、デコードされたとき、これは00A0(NBSP)に変換する必要がUTF-8エンコーディングのため:https://stackoverflow.com/a/2774507

はしかし、Golangでは、これはそれがどのように動作するかではありません。

s := `Text Text Text.=C2=A0 That's just two spaces` 

r := strings.NewReader(s) 

qpReader := quotedprintable.NewReader(r) 

all, _ := ioutil.ReadAll(qpReader) 

str := string(all) 

fmt.Println(strings.Index(str, "\xC2\xA0")) 

これは「15」を出力し、ここでの遊び場のリンクがあります:代わりに、それはそこNBSPを使用してのhttps://play.golang.org/p/8n6L7dlZPt

、それは\ XC2を維持し、「ちょうど2つのスペースのテキストテキストTextÂ」になります。

\ x00A0として正しくレンダリングするにはどうすればよいでしょうか?

+0

すべては問題ありません。あなたはUnicodeとそれをUTF-8で表現しています。あなたはU + 00A0の空き領域を必要とし、U + 00A0は_encoded_ _asです。UTF-8はバイトシーケンス0xC2A0です( "翻訳されていません")。すべてが良いです、quotedprintableはうまく動作し、あなたはnbspを持っています。 'fmt.Println(str)'を追加し、Playgroundで出力を調べると、nbspがあるので  HTMLエンティティをレンダリングします。 https://blog.golang.org/stringsとgoogleを読んでください。「すべてのソフトウェア開発者が絶対に最低限、絶対にUnicodeと文字セットについて知っておく必要があります」 – Volker

+0

BTW: "これを\ x00A0として正しくレンダリングするにはどうすればよいですか?"おそらく_wrong_ _question_です。 U + 00A0はUnicodeコードポイントです(Goで - 「ルーン」、抽象的な文字を表します)。このルーンを0xC2A0としてUTF-8でエンコードされた文字列でエンコードします。 unicode/utf8パッケージは、実際にコードポイントを必要とする場合は、コードポイントから/へコード変換するのに役立ちます(そうでない場合)。 – Volker

+0

ありがとう、非常に参考になりました。私のアプリの次のステップで、UTFサポートの欠如がこのサービスに欠けていたことが判明しました。これは単なる赤ちゃんのことでした。 –

答えて

0

Volkerが彼のコメントで説明したように、Go文字列は単純にバイトのスライスです。あなたの場合、それはすでにGoのデフォルトのエンコーディングであるUTF-8としてエンコードされています。実際のUnicodeコードポイント(ルーン囲碁用語で)にアクセスするには、のようなものを使用します。正しく文字列をレンダリングするためにどのように

// Prints 15. 
fmt.Println(strings.IndexRune(str, '\xA0')) 

// Prints A0. 
fmt.Printf("%X\n", []rune(str)[15]); 

ことはあなたがそれをレンダリングしたいに依存します。しかし、ほとんどの場合、すでにUTF-8になっているのでそのまま渡すことができます。

関連する問題