- ベストアンサー
UTF-16からUTF-8への変換
こんにちは。 UTF-16からUFT-8への変換で困っています。 CSVファイルの中にbase64でエンコードされたデータがあり、その中にUTF-16(リトルエンディアン)のデータが埋め込まれています。 base64のデータのデコードは、MIME::Base64のdecode_base64で出来ました。 この中から、文字列を取り出して、uft-8に変換したいのですが、なにかうまい方法はないものでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
$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ファイルの中から文字列を取り出す処理も質問に含まれるなら、適当な例を示してください。
その他の回答 (1)
- euthanasia
- ベストアンサー率63% (7/11)
回答No.2
(~, $utf16le, ~) = unpack("~a16~", $bin); でどうでしょう。
質問者
お礼
>(~, $utf16le, ~) = unpack("~a16~", $bin); ありがとうございます。できました。 asciiとはいいながら、要は単純に16バイトのバイナリになるんですね。 どうも発想がCにとらわれてしまうようです。
お礼
ありがとうございます。 なかなかまとまった資料がなくて苦労してました。 今回の場合、decodeのほうが適しているようです。 >CSVファイルの中から文字列を取り出す処理も質問に含まれるなら、適当な例を示してください。 CSVからの取り出しはできてます。質問には関係なかったですね。すみません。 それとは別に、気になっている問題があるのですが、 問題の文字列は、base64でエンコードされたバイナリの中に埋め込まれています。 現在、この文字列を、 (~,$c1,$c2,~,$c15,$c16,~)=unpack("~C16~",$bin); で取り出して、 $utf16le=pack("C16",$c1,$c2,~,$c15,$c16); といった感じで並べなおしているのですが、今ひとつ効率が悪いような気がします。 なにかうまい方法はありますでしょうか?