1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「ひらくん」をPerlで「30723089304F3093」に変換する

Posted at

 さて本日のPerlネタは文字コードについてです。

 たまーに入力されている文字のコード値が知りたくなりますよね? いや、なるんですよ、知りたくなる人もいるんですよ。はい、そんな一人である私も先日ちょっと16進表現のコード文字列が必要になることがありましたので、Perlで手軽に出力する方法をご紹介します。

 Perl内部で文字コードのエンコードを手軽に行なうにはEncodeモジュールの from_to というものを利用します。from_toというくらいなので下のデータのエンコードと変換したいエンコードを指定します。これで処理を行なうと指定したエンコードで変換されたデータが得られますのでその値をunpackで表示するという算段です。まあ使い方自体は大して難しくないのでソースをさくっと見てみましょう。

#!/usr/bin/perl
use utf8;
use Encode;
use strict;

# UTF-8フラグを落とす
my $buf = Encode::encode_utf8('ひらくん');

# UTF-8⇒UTF-16文字コード変換
Encode::from_to($buf, 'UTF-8', 'UTF-16BE');
my $is_u16 = uc unpack("H*", $buf );
print $is_u16 . "\n";

処理結果:

30723089304F3093

 ここでポイントとなるのはPerlのUTF8フラグというものです。use utf8をしてソースをutf8で記述している場合、Perlの変数はutf8フラグがonの状態になっています。この状態ですとPerlは変数内のデータをUTF8の文字として扱ってくれるので文字数のカウントなどもバイトサイズではなく、きちんと文字数を返してくれるわけです。ただ from_to の処理ではこのUTF8フラグがonになっていると都合がわるいのでこれをoffにする必要があります。それが encode_utf8 です。

 from_to で指定するエンコードの種類ですが基本的にはfrom側がutf8でto側になにか別のエンコードを指定することになるかと思います。そのさいに指定できるエンコードの種類は次の方法で確認かのうです。

@list = Encode->encodings(":all");
for (@list) {
        print $_ . "\n";
}

 それでは今回はここまでー

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?