2

「怪物文字」を避けるために、英語以外の文字をデータベース (MySQL) に格納するために Unicode NCR 形式を選択します。しかし、私が使用している PDF プラグイン (FPDF) は、Unicode NCR フォームを正しい形式として受け入れません。次のようにデータを直接表示します。

這個一個例子

しかし、私はそれを次のように表示したい:

這い個一個例子

Unicode NCR 形式を元の形式に変換する方法はありますか?

ps文の意味は、繁体字中国語で「これは例です」です。

ps NCR フォームがストレージ スペースを浪費することはわかっていますが、英語以外の文字を保存する最も安全な方法です。私が間違っている場合は修正してください。ありがとう。

4

3 に答える 3

3

PHP mbstring 拡張機能を使用して、より簡単な解決策があります。

// convert any Decimal NCRs to Unicode characters
$string = "這個一個例子";
$output = preg_replace_callback(
  '/(&#[0-9]+;)/u', 
  function($m){
    return utf8_entity_decode($m[1]);
  }, 
  $string
);
echo $output; // 這個一個例子

//callback function for the regex
function utf8_entity_decode($entity){
  $convmap = array(0x0, 0x10000, 0, 0xfffff);
  return mb_decode_numericentity($entity, $convmap, 'UTF-8');
}

「utf8_entity_decode」関数は PHP.net (Andrew Simpson) からのものです: http://php.net/manual/ru/function.mb-decode-numericentity.php#48085。正規表現内の非推奨の 'e' 修飾子を避けるために、コードを少し変更しました。

于 2016-07-02T11:57:20.197 に答える
1

解決策は非常に複雑です。

ソリューションには 3 つの部分があります。 パート 1: FPDF 中国語プラグインをインストールする パート 2: NCR 形式を UTF-8 に変換する パート 3: UTF-8 形式を BIG5 (または任意のターゲット エンコーディング) に変換する

パート1

ここから FPDF 中国語プラグインを取得しました: http://dev.xoofoo.org/modules/content/d1/d6e/a00073.html FPDF で漢字を表示するために使用され、必要なすべての中国語フォントを取得します。このプラグインをインストールするには、PHP に含めるだけです。(ただし、私の場合は、CellPDF という名前の別のプラグインを使用していますが、このプラグインはこの中国語のプラグインでクラッシュします。したがって、コードをマージして競合を解決する必要があります)

パート2

NCR 形式を UTF-8 に変換するには、次のコードを使用します。

function html_entity_decode_utf8($string)
{
    static $trans_tbl;

    // replace numeric entities
    $string = preg_replace('~&#x([0-9a-f]+);~ei', 'code2utf(hexdec("\\1"))', $string);
    $string = preg_replace('~&#([0-9]+);~e', 'code2utf(\\1)', $string);

    // replace literal entities
    if (!isset($trans_tbl))
    {
        $trans_tbl = array();

        foreach (get_html_translation_table(HTML_ENTITIES) as $val=>$key)
            $trans_tbl[$key] = utf8_encode($val);
    }

    return strtr($string, $trans_tbl);
}
function code2utf($num)
{
    if ($num < 128) return chr($num);
    if ($num < 2048) return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
    if ($num < 65536) return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
    if ($num < 2097152) return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
    return '';
}

これは php.net の laurynas butkus によって書かれています (リンク: http://www.php.net/manual/en/function.html-entity-decode.php ) ただし、このコード自体は NCR 形式を「モンスター キャラクター」に変換します。 "、良いスタートであることはわかっています。

パート 3

php.net を深く掘り下げた後、エンコーディングを変換するための素晴らしい関数 iconv を見つけました。したがって、上記のコードを次の関数でラップします。

function ncr_decode($string, $target_encoding='BIG5') {
    return iconv('UTF-8', 'BIG5', html_entity_decode_utf8($string));
}

したがって、NCR 文字列の前の行を変換したい場合は、次の関数を実行するだけで済みます。

ncr_decode("&#36889;&#20491;&#19968;&#20491;&#20363;&#23376;");

ps デフォルトでは、ターゲット エンコーディングを BIG5 に設定します。

それでおしまい!

于 2009-10-21T03:23:02.460 に答える
0

をご覧くださいhtml_entity_decode

PS: より良い方法は、UTF-8 を使用することです。SO で PHP、MySQL、および UTF-8 に関する質問を検索してください。考えられる落とし穴をリストしたものがいくつかあります。

于 2009-10-20T07:55:30.877 に答える