「lz-string」ライブラリで圧縮した文字をPHPで展開する際に文字化けする場合の対応方法
以前、JavaScript / PHPにて「lz-string」を用いてデータの圧縮・展開する方法をメモし、この方法で基本的には圧縮・展開できていたものの特定の文字列の場合に文字化けが発生した。以下に対応方法をメモ。
症状
JavaScript側で「あああああ」という文字列をcompressToEncodedURIComponentでURLエンコード&圧縮すると「」になり、これをPHP側でLZString::decompressFromEncodedURIComponentでURLデコード&展開すると「ああ�ああ」のように文字化けした。
ただ、こちらのようなオンラインツールだと正常に展開される。
対応方法
JavaScript
<script src="https://cdn.jsdelivr.net/npm/lz-string@1.5.0/libs/lz-string.min.js"></script> <script> const text = `あああああ`; // URLエンコード -> lz-string圧縮してBase64変換 -> 再度URLエンコード const base64_encode = encodeURIComponent(LZString.compressToBase64(encodeURIComponent(text))); // KQUQzMAcCMUEygjeiq0g8aVeRoA%3D console.log(base64_encode); </script>
PHP
<?php require_once __DIR__ . '/../../../vendor/autoload.php'; use \LZCompressor\LZString; $encode_text = 'KQUQzMAcCMUEygjeiq0g8aVeRoA%3D'; $decode_text = urldecode(LZString::decompressFromEncodedURIComponent($encode_text)); var_dump($decode_text); // string(15) "あああああ"
所感
Base64変換が入る分、圧縮率は下がるもののある程度は圧縮されるので今後はこちらの方法を使っていく。
関連記事
-
-
PHPとLINEを連携させて通知を送る方法(file_get_contents / curlの2パターン)
PHPとLINEを連携させ、LINEに何らかの通知メッセージを送信したい。以下に ...
-
-
Shift_JISでカタカナのソを出力するとエラー
先に結論として5C問題とかいうみたいで仕様らしい。 ■参考サイト http:// ...
-
-
PHPでキーや値は保持したまま順番を入れ替える
PHPで連想配列のキーや値は保持したまま順番をランダムに入れ替えたかった。一発で ...
-
-
PHP8.4 & CodeIgniter4でDateTimeImmutableエラー
CodeIgniter4.4.4がPHP8.3だと正常に動作していたが、PHP8 ...
-
-
PHPでHTMLメールを送信する方法(PHPMailerあり無しの2パターン)
PHPでHTMLメールを送信したい。また、メール関連の機能を実装する際は環境によ ...