Bloggerに書いたJavascriptが文字化けする
Google Bloggerの投稿やページの本文にはJavascriptを直接書くことができます。だいたいのコードは、そのまま動くのですがたまに意図しない動きになるときがあります。
この時、問題のJavascriptのコードをブラウザのデベロッパーツールのコンソールなどで実行すると正しく動くのに、Bloggerの本文に書くと動きません。
これは、Bloggerが一部の漢字をコード化(&#xxx;)するために発生します。
例えば、下にようにBloggerに書きます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script type="text/javascript"> | |
var e = document.getElementById("id1"); | |
e.innerText = "【<A B> Blur&Yellow <C D>】"; | |
</script> |
この時に、実際に生成されるHTMLコードは以下のように文字列中の文字の一部が&#xxx;の形になってしまいます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script type="text/javascript"> | |
var e = document.getElementById("id1"); | |
e.innerText = "【<A B> Blur&Yellow <C D>】"; | |
</script> |
これを防ぐ方法はないようですが、すべての漢字がこうなるわけではありません。試した限りでは主に記号がこうなるようです。
1234567890 | 1234567890 |
ABCDEFGHIJ | ABCDEFGHIJ |
{@[+*};:]? | {@[+*};:]? |
あいうおか漢字表示 | あいうおか漢字表示 |
解決方法1 あらかじめエンコードしておく
問題の文字列の場所がわかっていて数が少ない場合は、事前にencodeURIでエンコードした文字列をソースコードに書いて、decodeURIでデコードして使う方法があります。
解決方法2 INPUTのVALUEに書いておく
<INPUT TYPE="hidden">の値として書いて置いて、Javascriptでそれを取り出して使う方法があります。
下の例では、<input ... value="【MY TEXT】">の"【MY TEXT】"が、Javascriptの中で使いたい文字列です。この部分は、実際のBloggerが変換したHTMLでは、<input ... value="【MY TEXT】">となっていますが、もちろん表示はただしく、【MY TEXT】javascriptとなります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- この、id="place"のテキストを Javascript で動的に書き換えます--> | |
<div id="place">ここにJavascriptで動的に設定</div> | |
<!-- この、id="mytext"の value が、上の id="place" のテキストと設定されます--> | |
<input id="mytext" type="hidden" value="【MY TEXT】"> | |
<script type="text/javascript"> | |
<!-- input の value に設定している文字列を取り出す--> | |
var htmltext = document.getElementById("mytext").value; | |
<!-- 取り出した文字列に" (javascript)"という文字列を加えて id="place" に設定 --> | |
document.getElementById("place").innerText = htmltext + " (javascript)"; | |
</script> |