3

次のようにフォーマットされた文字列が届きます

Ciel Spa at SLSâ„¢ is a celestial dreamscape

それを次のように変更する書式設定スクリプトがあります

Ciel Spa at SLS™ is a celestial dreamscape

スクリプトはエンコーディングを変更します

return iconv("UTF-8", "ISO-8859-1//TRANSLIT//IGNORE", $str)

上記の iconv() は通常、商標記号を通常の文字 TM として返します。これは私にはうまくいかないので、シンボルを後でキャッチできる文字列に置き換えました。

str_replace("(TM)","™",$str);

これは、ブラウザでソースを表示しているときにうまく機能しますが、このテキストを imagettftext() にプッシュすると、商標記号が無視され、実質的に文字列が作成されます

Ciel Spa at SLS is a celestial dreamscape

もちろん、イメージとしてレンダリングされます。

使用しているフォントで商標記号がサポートされていることはわかっていますが、なぜ表示されないのかわかりません。mb_detect_encoding() は null を返しますが、ほとんどの文字列では UTF-8 を返します。

これまでのところ何も機能していないため、ザラザラした汚い回避策の準備ができています。html_entity_decode() と str_replace() の組み合わせを使用してみましたが、役に立ちませんでした。同じフォーマット スクリプトの以前のバージョンでは、文字列のエンコーディングを変更せずに、UTF ジャンク文字置換の長い配列を組み合わせてから、それを imagettftext() に渡しましたが、問題ないように見えました。私はそれを取り戻すことができないようです...何かアイデアはありますか??

4

1 に答える 1

0

iso-8859-1 文字エンコーディングには、単に商標記号が含まれていません。そこに何も表示されない理由は、有効な iso-8859-1 文字列の一部をこの文字セットの範囲外の記号に置き換えているためです。

を使用して、utf-8 から iso-8859-1 エンコーディングの変更を試すことができます

function decode_characters($info) 
{ 
    $info = mb_convert_encoding($info, "HTML-ENTITIES", "UTF-8"); 
    $info = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$info); 
    return($info); 
} 

このコードは、PHP の man ページに関する簡単な調査から得られたものです。

于 2012-07-24T18:19:48.420 に答える