• ベストアンサー

UTF-16からUTF-8への変換

こんにちは。 UTF-16からUFT-8への変換で困っています。 CSVファイルの中にbase64でエンコードされたデータがあり、その中にUTF-16(リトルエンディアン)のデータが埋め込まれています。 base64のデータのデコードは、MIME::Base64のdecode_base64で出来ました。 この中から、文字列を取り出して、uft-8に変換したいのですが、なにかうまい方法はないものでしょうか?

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

  • ベストアンサー
回答No.1

$utf16le に decode_base64 の変換結果が入っているとして、 utf8のバイト列に変換する場合 use Encode qw( from_to ); $utf8 = $utf16le; from_to($utf8, "utf16le", "utf8"); perlの内部表現であるutf8フラグ付きのutf8文字列に変換する場合 use Encode qw( decode ); $utf8 = decode("utf16le", $utf16le); どちらも $utf8 に変換結果が入ります。 CSVファイルの中から文字列を取り出す処理も質問に含まれるなら、適当な例を示してください。

titokani
質問者

お礼

ありがとうございます。 なかなかまとまった資料がなくて苦労してました。 今回の場合、decodeのほうが適しているようです。 >CSVファイルの中から文字列を取り出す処理も質問に含まれるなら、適当な例を示してください。 CSVからの取り出しはできてます。質問には関係なかったですね。すみません。 それとは別に、気になっている問題があるのですが、 問題の文字列は、base64でエンコードされたバイナリの中に埋め込まれています。 現在、この文字列を、 (~,$c1,$c2,~,$c15,$c16,~)=unpack("~C16~",$bin); で取り出して、 $utf16le=pack("C16",$c1,$c2,~,$c15,$c16); といった感じで並べなおしているのですが、今ひとつ効率が悪いような気がします。 なにかうまい方法はありますでしょうか?

その他の回答 (1)

回答No.2

(~, $utf16le, ~) = unpack("~a16~", $bin); でどうでしょう。

titokani
質問者

お礼

>(~, $utf16le, ~) = unpack("~a16~", $bin); ありがとうございます。できました。 asciiとはいいながら、要は単純に16バイトのバイナリになるんですね。 どうも発想がCにとらわれてしまうようです。

関連するQ&A