PR

FreeNX からWindows にコピペできない

Ubuntu Server 12.04 に無理やりデスクトップ環境をねじ込んで、FreeNX で繋いでいるわけだけれど、コピー・アンド・ペーストで問題が発生した。

接続しているWindows (Windows7)のクリップボードを経由して何らか文字(日本語)を送り込む事は問題ないようだが、その逆、Ubuntu から文字列(日本語)を取得しようとするとよろしくない。

例えば、Ubuntu 上では適切に表示さる「最初」という文字列をWindows 側に持ってくると「\u6700\u521d」となってしまう(場合によってはUbuntu 内でも発生する)。

FreeNX 側にそれらしい設定がないか調べてみたけれど、見つけることはできなかった。なので、これをPHP スクリプトを使って修正しようとしたメモが今回の内容。

スポンサードリンク

もし、「最」とでもなれば、次のようににして復元することができる。

mb_convert_encoding($str, 'UTF-8', 'HTML-ENTITIES');

しかし、「\u6700」に対しては、当然かもしれないが正しく動作しない。「 ‘HTML-ENTITIES’」の部分に該当するものはないか「PHP: サポートされる文字エンコーディング – Manual」などを見るけれど、それらしいものは見つけられなかった。

もし、強引にやるならば、「\u」を「&#x」に、「;$」を「”」に置換しても良いかもしれないけれど、きっと他にも方法があるはずだ。

この辺に関しては「Unicode Han Character ‘most, extremely, exceedingly’ (U+6700)」などが参考になった。

幾つか見て回るとcallback を用いたものがあったが、今回作業しているCakePHP 内で動作させることができなかった(または文字化けしてしまった)。

調べると、これと同じような方法が他にも出てきたから、おそらく方法的にはこれにたどり着くのだと思う。そこで、同じ事を他の表現をしているものが無いかを探してみると、次のコードに出会うことができた。

function unicodeString($str, $encoding=null) {
 if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
 return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) {
 return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
 }, $str);
}

※「Unicode character in PHP string – Stack Overflow」より引用

この方法で試用したところ、改行を含む長い文章(全て日本語で構成されたサンプル文字列)でも問題なく変換でき、改行も正しく再現された。

参考文献

コメント