プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
UTF-16からUFT-8への変換で困っています。
CSVファイルの中にbase64でエンコードされたデータがあり、その中にUTF-16(リトルエンディアン)のデータが埋め込まれています。

base64のデータのデコードは、MIME::Base64のdecode_base64で出来ました。

この中から、文字列を取り出して、uft-8に変換したいのですが、なにかうまい方法はないものでしょうか?

A 回答 (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ファイルの中から文字列を取り出す処理も質問に含まれるなら、適当な例を示してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
なかなかまとまった資料がなくて苦労してました。
今回の場合、decodeのほうが適しているようです。

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

お礼日時:2008/07/22 09:54

(~, $utf16le, ~) = unpack("~a16~", $bin);



でどうでしょう。
    • good
    • 1
この回答へのお礼

>(~, $utf16le, ~) = unpack("~a16~", $bin);
ありがとうございます。できました。

asciiとはいいながら、要は単純に16バイトのバイナリになるんですね。
どうも発想がCにとらわれてしまうようです。

お礼日時:2008/07/29 09:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!