勉強したことのメモ

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

  関連記事

PHPとLINEを連携させて通知を送る方法(file_get_contents / curlの2パターン)
PHPとLINEを連携させて通知を送る方法(file_get_contents / curlの2パターン)

PHPとLINEを連携させ、LINEに何らかの通知メッセージを送信したい。以下に ...

Shift_JISでカタカナのソを出力するとエラー
Shift_JISでカタカナのソを出力するとエラー

先に結論として5C問題とかいうみたいで仕様らしい。 ■参考サイト http:// ...

PHPでキーや値は保持したまま順番を入れ替える
PHPでキーや値は保持したまま順番を入れ替える

PHPで連想配列のキーや値は保持したまま順番をランダムに入れ替えたかった。一発で ...

PHP8.4 & CodeIgniter4でDateTimeImmutableエラー
PHP8.4 & CodeIgniter4でDateTimeImmutableエラー

CodeIgniter4.4.4がPHP8.3だと正常に動作していたが、PHP8 ...

PHPでHTMLメールを送信する方法(PHPMailerあり無しの2パターン)
PHPでHTMLメールを送信する方法(PHPMailerあり無しの2パターン)

PHPでHTMLメールを送信したい。また、メール関連の機能を実装する際は環境によ ...