- ベストアンサー
base64encodeでの文字化けについて
- 先日、PHPとjavascriptのエンコードについて質問をしました。その後いろいろと試してみたところ、javascript上で日本語の文字列に対してbase64_encodeをして、base64_decodeをすると文字化けが起こりました。
- 文字コードはUTF-8を使用しているのですが、他の文字コードで試してみても文字化けします。原因や対処方法がおわかりの方がいらっしゃれば、教えて下さい。
- 結果は以下の通りです。 元の文字列:abcde12345あいうえお 変換後の文字列:abcde12345BDFHJ
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
バイナリデータではなく文字列ですか。 IE10以上なら、JavaScript組み込み関数にbtoa()、atob()というBASE64変換する関数(メソッド)がありますよ。 https://developer.mozilla.org/ja/docs/Web/API/window.btoa JavaScriptでUnicode文字列をBASE64に変換する場合は、概ね他のエンコード方式で変換してから改めてBASE64にしなければなりません。 たぶんJavaScriptの文字列はバイト単位ではなく、1文字ずつの扱いだから変換できないんでしょう。 MDNではencodeURIComponentとescapeの両方を使っていますが、片方だけで良いと思います。
その他の回答 (3)
- pringlez
- ベストアンサー率36% (598/1630)
結局、PHPは関係ないということは分かったのですね。 はいはい、なるほど…。 説明は省きますが、そのサイトから「utf.js」もDLし、 以下の様に修正すればいいでしょう。それだけの事です。 …という感じで、抽象的な質問をするより 具体的なソースを張ったほうが解決は早いですよ。 <html> <head> <title>サンプル</title> <script type="text/JavaScript" src="utf.js"></script> <script type="text/JavaScript" src="base64.js"></script> </head> <body> <script type="text/javascript"> str = "abcde12345あいうえお"; encode_str = base64encode(utf16to8(str)); decode_str = utf8to16(base64decode(encode_str)); document.write("元の文字列:" + str + "<br>変換後の文字列:" + decode_str); </script> </body> </html>
お礼
回答ありがとうございました。
補足
回答で書いていただいた処理でうまくいきました。 最初の質問に戻りますが、PHPでエンコードしてjavascriptで デコードする場合も、同様にPHP側でUTF16からUTF8変換を してからエンコードすると解決するということになるでしょうか。 また最終的な目的はバイナリデータをエンコード、デコードする ことなので、バイナリでも同じようにいくかどうか、この辺りは また試してみたいと思います。 いずれにしても大きなヒントになりました。ありがとうございました。
- t_ohta
- ベストアンサー率38% (5238/13705)
base64.js が日本語に対応できてないようですね。
お礼
回答ありがとうございました。 base64.jsでは日本語のエンコード、デコードは できないということですね。残念です。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
base64は無関係ですね。 >変換後の文字列:abcde12345BDFHJ UNICODEの第一バイトが落ちているように見えます。 あ:UNICODE 0x3042 B:UNICODE 0x0042 い:UNICODE 0x3044 D:UNICODE 0x0044 う:UNICODE 0x3046 F:UNICODE 0x0046 え:UNICODE 0x3048 H:UNICODE 0x0048 お:UNICODE 0x304A J:UNICODE 0x004A
お礼
回答ありがとうございました。 参考になりました。
お礼
回答ありがとうございました。
補足
最初の質問との関連がわかりづらくてすみません。 最終的な目的はバイナリのエンコード、デコードです。 前回の回答を参考にして作成ミスなどを疑い、原因の 切り分けをしていたのですが、その中でjavascriptで 日本語をエンコード、デコードして元の文字列に 戻らなかったので、疑問に思って今回の質問をさせて いただきました。 前回にひきつづき、わかりやすい回答をしていただき 大変助かりました。ありがとうございました。