PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPであらゆる種類のスマートクォートを通常の引用符に変換する方法

PHPでテキストを処理する際、Wordやその他のエディタからコピーした文字列に「スマートクォート」(カーリークォート)と呼ばれる装飾的な引用符が含まれていることがあります。これらを通常のシングルクォート(')やダブルクォート(")に一括で置き換えたい場合、以下のコードが役立ちます。このコードはUTF-8でエンコードされた入力を前提としています。

スマートクォート変換用コード

$chr_map = array(
    // Windows codepage 1252
    "\xC2\x82" => "'", // U+0082⇒U+201A シングル・ロー9引用符
    "\xC2\x84" => '"', // U+0084⇒U+201E ダブル・ロー9引用符
    "\xC2\x8B" => "'", // U+008B⇒U+2039 左向きシングルアングル引用符
    "\xC2\x91" => "'", // U+0091⇒U+2018 左シングル引用符
    "\xC2\x92" => "'", // U+0092⇒U+2019 右シングル引用符
    "\xC2\x93" => '"', // U+0093⇒U+201C 左ダブル引用符
    "\xC2\x94" => '"', // U+0094⇒U+201D 右ダブル引用符
    "\xC2\x9B" => "'", // U+009B⇒U+203A 右向きシングルアングル引用符
    // 通常のUnicode // U+0022 引用符 (")
    // U+0027 アポストロフィ (')
    "\xC2\xAB" => '"', // U+00AB 左向きダブルアングル引用符
    "\xC2\xBB" => '"', // U+00BB 右向きダブルアングル引用符
    "\xE2\x80\x98" => "'", // U+2018 左シングル引用符
    "\xE2\x80\x99" => "'", // U+2019 右シングル引用符
    "\xE2\x80\x9A" => "'", // U+201A シングル・ロー9引用符
    "\xE2\x80\x9B" => "'", // U+201B シングル・ハイリバース9引用符
    "\xE2\x80\x9C" => '"', // U+201C 左ダブル引用符
    "\xE2\x80\x9D" => '"', // U+201D 右ダブル引用符
    "\xE2\x80\x9E" => '"', // U+201E ダブル・ロー9引用符
    "\xE2\x80\x9F" => '"', // U+201F ダブル・ハイリバース9引用符
    "\xE2\x80\xB9" => "'", // U+2039 左向きシングルアングル引用符
    "\xE2\x80\xBA" => "'", // U+203A 右向きシングルアングル引用符
);
$char_val = array_keys ($chr_map); // ただし:効率化のためには
$rpl = array_values($chr_map); // これら2つの配列は事前に計算しておくべき
$str = str_replace($char_val, $rpl, html_entity_decode($str, ENT_QUOTES, "UTF-8"));

仕組みの解説

すべてのUnicode文字は、必ず1つの「一般カテゴリー(General Category)」に属しています。その中でも、引用符文字を含みうるカテゴリーは以下の通りです。

Ps 「句読点、開き括弧」
Pe 「句読点、閉じ括弧」
Pi 「句読点、始め引用符(使用状況によってPsまたはPeのように振る舞う)」
Pf 「句読点、終わり引用符(使用状況によってPsまたはPeのように振る舞う)」
Po 「その他の句読点」

入力のエンコーディングが不明な場合の対処法

入力文字列がUTF-8でエンコードされているかどうか確信が持てない場合は、他の処理を行う前に以下のコードを挿入してください。

if ( !preg_match('/^\X*$/u', $str)) {
    $str = utf8_encode($str);
}

0x80〜0x9Fの範囲のデータを正規化する方法

Windows-1252(CP1252)由来の制御領域に含まれるデータを正規化したい場合は、以下のコードを使用できます。これにより、ユーロ記号やダッシュなど、Windows独自のマッピングを持つ文字も正しく処理されます。

$normalization_map = array(
    "\xC2\x80" => "\xE2\x82\xAC", // U+20AC ユーロ記号
    "\xC2\x82" => "\xE2\x80\x9A", // U+201A シングル・ロー9引用符
    "\xC2\x83" => "\xC6\x92", // U+0192 フック付きラテン小文字f
    "\xC2\x84" => "\xE2\x80\x9E", // U+201E ダブル・ロー9引用符
    "\xC2\x85" => "\xE2\x80\xA6", // U+2026 三点リーダー
    "\xC2\x86" => "\xE2\x80\xA0", // U+2020 ダガー
    "\xC2\x87" => "\xE2\x80\xA1", // U+2021 ダブルダガー
    "\xC2\x88" => "\xCB\x86", // U+02C6 サーカムフレックス修飾文字
    "\xC2\x89" => "\xE2\x80\xB0", // U+2030 パーミル記号
    "\xC2\x8A" => "\xC5\xA0", // U+0160 カロン付きラテン大文字S
    "\xC2\x8B" => "\xE2\x80\xB9", // U+2039 左向きシングルアングル引用符
    "\xC2\x8C" => "\xC5\x92", // U+0152 ラテン大文字合字OE
    "\xC2\x8E" => "\xC5\xBD", // U+017D カロン付きラテン大文字Z
    "\xC2\x91" => "\xE2\x80\x98", // U+2018 左シングル引用符
    "\xC2\x92" => "\xE2\x80\x99", // U+2019 右シングル引用符
    "\xC2\x93" => "\xE2\x80\x9C", // U+201C 左ダブル引用符
    "\xC2\x94" => "\xE2\x80\x9D", // U+201D 右ダブル引用符
    "\xC2\x95" => "\xE2\x80\xA2", // U+2022 ビュレット(黒丸)
    "\xC2\x96" => "\xE2\x80\x93", // U+2013 エンダッシュ
    "\xC2\x97" => "\xE2\x80\x94", // U+2014 エムダッシュ
    "\xC2\x98" => "\xCB\x9C", // U+02DC 小さなチルダ
    "\xC2\x99" => "\xE2\x84\xA2", // U+2122 商標記号
    "\xC2\x9A" => "\xC5\xA1", // U+0161 カロン付きラテン小文字s
    "\xC2\x9B" => "\xE2\x80\xBA", // U+203A 右向きシングルアングル引用符
    "\xC2\x9C" => "\xC5\x93", // U+0153 ラテン小文字合字oe
    "\xC2\x9E" => "\xC5\xBE", // U+017E カロン付きラテン小文字z
    "\xC2\x9F" => "\xC5\xB8", // U+0178 分音符号付きラテン大文字Y
);
$chr = array_keys ($normalization_map); // ただし:効率化のためには
$rpl = array_values($normalization_map); // これら2つの配列は事前に計算しておくべき
$str = str_replace($chr, $rpl, $str);

まとめ

上記のコードを活用することで、Windows-1252やUnicodeの各種スマートクォートを、PHPで確実に標準的な引用符へと変換できます。特にCMSやフォームからの入力を扱う際には、事前にこれらの変換処理を組み込んでおくことで、データベース保存時や表示時の文字化けトラブルを防ぐことができます。パフォーマンスを重視する場合は、array_keys()array_values()の結果を毎回計算せず、キャッシュして再利用することをおすすめします。

  1. SAPとPHPを統合する方法:RFCとWebサービスによる連携の基本

    SAPとPHPの連携方法 SAPシステムとPHPアプリケーションを接続する手段はいくつか存在しますが、その中でも開発者の間で特に広く利用されているのがWebサービスとRFC(Remote Function Call:リモートファンクションコール)の2つです。 SAPRFC拡張モジュールとは SAPRFCは、PHP 4およびPHP 5向けに提供されている拡張モジュールです。このモジュールを活用することで、PHPスクリプトからSAP R/3上のABAPファンクションモジュールを直接呼び出すことが可能になります。 主な活用シーン Webアプリケーションの構築: PHP言語を使用して、SAP R

  2. PHPのmb_list_encodings()関数でサポートされている全エンコーディングを配列として取得する方法

    PHPのmb_list_encodings()関数は、現在の環境でサポートされているすべての文字エンコーディングを配列として返します。この関数はPHP 5以降のバージョンで利用可能です。マルチバイト文字列処理を行う際に、対応しているエンコーディングの一覧を確認したい場合に便利な関数です。構文array mb_list_encodings()パラメータmb_list_encodings()は引数を受け取りません。戻り値この関数は、サポートされているエンコーディング名を格納した数値インデックス付きの配列を返します。各要素には「UTF-8」や「SJIS」などのエンコーディング名が文字列として含まれま