- 締切済み
JavaScriptが文字化けする
JavaScriptファイルをSJIS、EUC、UTF8を統一したために スクリプト上で var str = "あいうえー"; をUTF16で var str = "\u3042\u3044\u3046\u3048\u30fc"; このように変換をしましたが alert("\u3402");とかですと、文字化けはしないのですが、 innerhtml="\u3402"; のようにやると、文字化けをしてしまいます。 どのようにしたら対処できますでしょうか? もし、対処方法なければ、仕方ないので、コード判別をできるようにと考えています。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10361)
No1です。 なぜそこまでかたくなに、コードを秘密にするのですか?恥ずかしい? 質問者が情報を出さないと、解決するものもしませんよ。
- q-ue
- ベストアンサー率75% (12/16)
>>JavaScriptファイルをSJIS、EUC、UTF8を統一したためにスクリプト上で 文字コードを統一するだけなら、エスケープシーケンスに変換するのではなく、ファイルの文字コードを変更すればいいのでは? (以下引用) EUCコードのHTMLに対し、JavaScript用エンコードにされたUTF16で (イメージで確認してください) innerhtml= "<table><tr><td>@" + username + "のツィート</td></tr>"+ "<table><tr><td>" + (JSONより変換したHTML) + "</td></tr>" + "</table>" の部分の、「のツィート」 を JavaScript用エンコードにして化けてしまうようです。 HTMLがUTF8ですと、正常に表示されます。 (引用終わり) JavaScriptファイルの文字コードはUTF-8、HTMLファイルはEUC-JPになっているということですか? もしかして、外部から取得したデータではなく、そのJSファイルの中に「のツィート」という文字がそのまま書かれているのですか? もしそうだとしたら、文字化けするのは当たり前ですが...。 HTMLやJavaScriptファイルの文字コードは一つに統一した方が扱いやすいと思います。 文字コードを同一にできないのならば、 <script src="ソース" charset="JSファイルの文字コード"></script> というように、HTMLで文字コードを指定することもできます。
- notnot
- ベストアンサー率47% (4900/10361)
No1です。 先ほど書いた文の意味がわかりませんか? >とにかく、文字化けをするというコードを書いてもらわないと、アドバイスしようが無いです。 「文字化けをするというコードを書いてください。」って、他に言い換えようが無いので、もう一度同じことを書きました。 >それが、alertでやると、文字化けをしません。 「普通にやると化けるはずは無いので。 」と書いたとおりです。化けないのが正常です。
補足
ありがとうございます。 そこが困っている所です。
- notnot
- ベストアンサー率47% (4900/10361)
No1です。 補足の内容がさっぱり理解できません。 >EUCコードのHTMLに対し、JavaScript用エンコードにされたUTF16で それは当然では?ページ全部UTF-16で統一しないと。 とにかく、文字化けをするというコードを書いてもらわないと、アドバイスしようが無いです。 普通にやると化けるはずは無いので。
補足
ありがとうございます。 それが、alertでやると、文字化けをしません。
- Gotthold
- ベストアンサー率47% (396/832)
> var str = "\u3042\u3044\u3046\u3048\u30fc"; これは、JavaScriptのUnicodeエスケープシーケンスであってUTF16ではないです。 ブラウザがJavaScriptの文字コードを正しく認識できているなら その文字コードで普通に書けば良くて、 Unicodeエスケープシーケンスを使う必要は特にないはずですが? (使用している文字コードで表現できない文字を文字列リテラルに含めたいならともかく。) ASCII互換のどの文字コードと認識されても使えるように、ASCIIの範囲内の文字しか使わないって言う配慮なのかなあ。 JSONでやりとりするときはUnicodeエスケープシーケンスされてることが多いし、場合によってはそれもありなのかもね。 なお、「あ」のコードポイントはU+3042。
補足
ありがとうございます。 実際は、旧APIでTwitterからJSONを取得して、それを表題の枠の中に表示するものですが、 その表題が化けてしまいます。 実際のソースは結構複雑になるのですが 例えば・・・ EUCコードのHTMLに対し、JavaScript用エンコードにされたUTF16で (イメージで確認してください) innerhtml= "<table><tr><td>@" + username + "のツィート</td></tr>"+ "<table><tr><td>" + (JSONより変換したHTML) + "</td></tr>" + "</table>" の部分の、「のツィート」 を JavaScript用エンコードにして化けてしまうようです。 HTMLがUTF8ですと、正常に表示されます。 #JavaScript用エンコードにしたものは、外部ファイルになります。 JavaScript用エンコードではなく、生の漢字コードを埋め込んだ場合 UTF8にしたものは、UTF8のHTMLで、EUCのものはEUCのHTMLできちんと表示されます。 化けるブラウザは、確認した全ブラウザでなります。(IE/FF/Op/Sa/Chrome)
- notnot
- ベストアンサー率47% (4900/10361)
>のようにやると、文字化けをしてしまいます。 Firefox18.0.1とIE9でやってみたけど化けません。「㐂」という字ですよね? <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-16" /> </head><body> <div id="X"> </div> <script> var x=document.getElementById("X"); if(x) { x.innerHTML="\u3402"; } </script> </body></html>
補足
ありがとうございます。 実際は、旧APIでTwitterからJSONを取得して、それを表題の枠の中に表示するものですが、 その表題が化けてしまいます。 実際のソースは結構複雑になるのですが 例えば・・・ EUCコードのHTMLに対し、JavaScript用エンコードにされたUTF16で (イメージで確認してください) innerhtml= "<table><tr><td>@" + username + "のツィート</td></tr>"+ "<table><tr><td>" + (JSONより変換したHTML) + "</td></tr>" + "</table>" の部分の、「のツィート」 を JavaScript用エンコードにして化けてしまうようです。 HTMLがUTF8ですと、正常に表示されます。 #JavaScript用エンコードにしたものは、外部ファイルになります。
補足
ありがとうございます。 JavaScriptファイルは、日本語部分をUTF16にエンコードしてから エスケープしているために、 SJISでもEUCでもUTF8でもない ASCIIの状態になっています。 また、twitter APIからJSONを手動で取得して、何も変換せずURLを js ファイルにしてやると これも文字化けがしません。 (同じスクリプト上で、http fetchを単純に行っています)