• ベストアンサー

文字列のunicodeへの変換方法

utf8で記述したperlスクリプトを書いてます。 諸般の事情より use utf8; は宣言できません。 そんな状況で $test = 'テスト'; という文字列を '%u30c6%u40b9%u30c8' に変換したいのですが 方法が見つかりません。 unpackやsprintfを使ってあげるのかと思うのですが 思うような値が得られません。 わかる方、いらっしゃると思います。 教えていただけませんか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Hasty
  • ベストアンサー率73% (19/26)
回答No.1

過去ログにぴったりの回答がありました。 http://okwave.jp/kotaeru.php3?q=1257793 回答3のjs_escape関数を使って print js_escape($test, 'utf8'); としたところ、 %u30C6%u30B9%u30C8 と表示されました。 (質問では「ス」が%u40b9となっていますが、%u30b9が正しいようです。)

to_kyo
質問者

お礼

どうもありがとうございます。 過去ログからうまく見つけられず、お手間を取らせました。 また、「ス」は%u30b9が正です。 ご指摘ありがとうございます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

use Encode; が使えたら use Encode qw(from_to); $test = 'テスト'; #'%u30c6%u30b9%u30c8'表現に変える from_to($test, "UTF-8","UTF-16LE"); $conv=join("",map(sprintf("%%u%02x", $_),unpack("S*",$test))); print $conv; でいいかと思います

to_kyo
質問者

お礼

先の過去の回答にもあったものですね。 こちらが単純なので、これを使わせていただきます! もともとEncodeは使っていました。 実は変換対象の文字列がcp932に変換されていたことが発覚したのですが、utf8の部分をcp932にすることで対応しました。 また、asciiの場合は%uxxではなく%uxxxxと表示させたかったことと、各文字の間にスペースが欲しかったので from_to($test, "cp932","UTF-16LE"); $conv=join("",map(sprintf("%%u%04x ", $_),unpack("S*",$test))); と修正しました。 UTF-16LEについては、よくわからないので、折をみて勉強します。 ありがとうございました。

関連するQ&A