PHP開発では、 Pack()関数は、データをバイナリ文字列にパッケージ化するためによく使用されます。これは、ネットワークプロトコル、ファイル形式、または基礎となるデータ交換を扱うときに非常に役立ちます。ただし、多くの開発者は、Pack()関数を使用してデータを出力する際に「文字化けした」問題に遭遇しますが、これはしばしば混乱しています。この記事では、この現象に関する文字化けのコードの原因を分析し、解決策、特にキャラクターエンコーディングの観点から詳細な議論を提供します。
Pack()関数は、指定された形式に従ってデータをバイナリ文字列にパッケージ化します。その典型的な使用法は次のとおりです。
<?php
// バイナリ形式で2つの整数をパッケージ化します
$data = pack("CC", 65, 66);
echo $data; // 出力 AB
?>
ここでは、パック( "CC"、65、66)は、バイナリ文字列に対応するASCII文字「A」と「B」を生成します。
pack()は、必ずしも有効なテキストエンコーディングではなく、生のバイナリデータを出力します。 EchoまたはPrintを使用して出力を使用すると、ターミナルまたはブラウザは現在のデフォルトエンコードに従ってこれらのバイトを解釈します。
<?php
// いくつかのバイナリデータを梱包します
$data = pack("H*", "e4bda0e5a5bd");
echo $data; // これはそうあるべきでした“こんにちは”のUTF-8コーディング,但直接出力たぶん文字化けした
?>
ここでは、 E4BDA0E5A5BDは「Hello」UTF-8 HEXADECIMALエンコーディングです。環境がUTF-8ではない場合、またはエンコードが正しく設定されていない場合、出力はCarled Codeを表示します。
システムまたはアプリケーションが異なる場合、エンコードのデフォルト処理が異なります。 pack()元のバイトを生成すると、自動的に変換されてエンコードされません。そのコンテンツを何らかのエンコードされた文字列として扱い、実際のデータエンコードが一致しない場合、ガーブルコードは必然的に発生します。
出力コンテンツは、受信機のエンコードと解析に依存します。たとえば、ブラウザはデフォルトではUTF-8ではないか、端子フォントが対応するエンコードされた文字をサポートせず、Garledコードも表示されます。
PHPファイルがUTF-8エンコードとして保存されていること、およびWebページまたは端末環境がUTF-8も使用していることを確認してください。 Webページで設定できます。
<?php
header("Content-Type: text/html; charset=utf-8");
?>
テキストを人に出力する必要がある場合は、最初にバイナリデータを適切なエンコードされた文字列に変換します。
<?php
// パック“こんにちは”の UTF-8 16進数データ
$data = pack("H*", "e4bda0e5a5bd");
// 出力之前用 mb_convert_encoding 转换コーディング
echo mb_convert_encoding($data, "UTF-8", "UTF-8");
?>
または、 bin2hex()を使用して、バイナリデータの16進表現を表示して、文字化けコードの出力を直接避けます。
<?php
echo bin2hex($data); // 出力e4bda0e5a5bd,便利なデバッグ
?>
バイナリデータを送信する前に、エンコードを盲目的に変換しないでください。一般的に、バイナリデータはバイナリであり、アプリケーションまたはプロトコル層は正しく解析されます。表示に使用する場合にのみ、対応するエンコードされた文字列に変換する必要があります。
<?php
// による UTF-8 コーディングパック字符串 “こんにちは”
$utf8_string = "こんにちは";
$packed = pack("a*", $utf8_string);
// 直接出力(たぶん文字化けした)
echo $packed;
// 设置正确コーディング,文字化けのコードは避けてください
header("Content-Type: text/html; charset=utf-8");
// 出力转换后の字符串
echo mb_convert_encoding($packed, "UTF-8", "UTF-8");
?>
Pack()関数の本質はバイナリデータを生成することであり、文字化けの問題は主に理解をエンコードする一貫性のない文字に起因します。重要なポイントは次のとおりです。
pack()の出力は、通常のテキストではなく、生のバイトであることを理解してください。
出力または処理時にデータが一貫してエンコードされていることを確認してください。
正しくエンコードされていない限り、バイナリデータをテキストとして直接出力しないでください。
これらのコーディング原則を習得した後、 Pack()を使用して、文字化けしたコードの問題に簡単に遭遇することはありません。
ドメイン名例:
<?php
// 例 URL ドメイン名をに置き換えます m66.net
$url = "https://m66.net/api/data";
echo $url;
?>