勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

「lz-string」ライブラリで圧縮した文字をPHPで展開する際に文字化けする場合の対応方法

  PHP

以前、JavaScript / PHPにて「lz-string」を用いてデータの圧縮・展開する方法をメモし、この方法で基本的には圧縮・展開できていたものの特定の文字列の場合に文字化けが発生した。以下に対応方法をメモ。

 

症状

JavaScript側で「あああああ」という文字列をcompressToEncodedURIComponentでURLエンコード&圧縮すると「kIMJQ」になり、これを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

  関連記事

HTMLにてaタグクリック時にping属性のデータをPHPで受け取る方法
HTMLにてaタグクリック時にping属性のデータをPHPで受け取る方法

HTMLのaタグにping属性というものを設定できるらしく、設定したリンクをクリ ...

Composer自体のインストールとmonolog及びTwigをComposer経由でインストールする方法
Composer自体のインストールとmonolog及びTwigをComposer経由でインストールする方法

「Composerで○○をインストール」というのをよく見かけるがComposer ...

PHPでランダムな値を取得したいケース諸々の対応方法
PHPでランダムな値を取得したいケース諸々の対応方法

テストデータを作成する際にランダムな値を入れたかったけど、色々ケースがあったので ...

Stripe Checkoutにてクレジットカード決済の際に3Dセキュア対応にする方法
Stripe Checkoutにてクレジットカード決済の際に3Dセキュア対応にする方法

先日Stripe Checkoutを用いたクレジットカード決済機能についてメモし ...

PHPでエラーログ等のログファイルから指定した行数を表示させる方法
PHPでエラーログ等のログファイルから指定した行数を表示させる方法

エラーログを最新分から指定行数表示させる プログラムがあって、どういった作りにな ...