SlideShare a Scribd company logo
1 of 21
PHPとRubyで符号化。



文字エンコーディング【UTF-8】で

書いた文字を実際に符号化・復号化の

   様子を確認してみる。
Ruby



まず、文字列を1byte単位に分解して

 中身のバイト列がどのように

符号化されているのか見てみたい。



      どうやるの?
Ruby



    文字を1バイト単位に分解したい

              ↓

     String#unpack()メソッド。

とりあえず必要なパラメータは【C*】か【H*】。
Ruby


       【C*】とは?

対象の文字及び文字列を任意の文字コードで

   符号化した際の各バイト値を

   0〜255までの8bitの範囲で

 10進数で表現した値の配列を返すよ。

※スクリプトの文字コードによって返ってくる

    合計バイト数は異なるよ

    例えば、UTF-8やUTF-16

 などによって都度かわってしまうよ。
Ruby



       【H*】とは?

   対象の文字及び文字列を任意の

    文字コードで符号化した際の

各バイト値を16進数で表現し、それを連結した

   形式の文字列を配列として返す。
Ruby



とりあえずやってみる。引数は【C*】だよ。

              hoge =“あ”;

foo = hoge.encode(“UTF-8”).unpack(“C*”)

          # => [227, 129, 130]

 これは”あ”という文字をUTF-8で符号化

      した場合のバイト列だよ。
Ruby

次に引数を【H*】と変えてやってみる。

              hoge =“あ”;

foo = hoge.encode(“UTF-8”).unpack(“H*”)

            # =>["e38182"]

     という配列が返ってくるよ。

[“e38182”] は[227, 129, 130] を16進数に

          変換したものだよ。
Ruby




では、入力した文字をUnicode文字集合上の

   符号位置に復号させるには?

           ↓

    unpackと対をなすメソッド

 【Array#pack】メソッドをつかうよ。
Ruby



          [227, 129, 130]

この配列を再び、Unicode上の符号位置

      に復号するためには?

  print [227, 129, 130] .pack(“C*”)

と同じ【C*】引数でpackしてやればいい。

 すると再び【あ】と表記されるよ。
Ruby

  次に、16進数表記されたバイト列

            ["e38182"]

この配列を再び、Unicode上の符号位置

      に復号するためには?

    print ["e38182”].pack(“H*”)

と同じ【H*】引数でpackしてやればいい。

 すると再び【あ】と表記されるよ。
PHPの場合。



まず、文字列を1byte単位に分解して

 中身のバイト列がどのように

符号化されているのか見てみたい。



      どうやるの?
PHPの場合。



           まずは

 【mb_convert_encoding()】関数で

対象の文字列を任意の文字コードに変換。

     その後、Rubyと同じく

【unpack()】関数でバイト単位の配列が

        返ってくるよ。
PHPの場合。



                            やってみる。

<?php

$hoge =“あ”;

//今回は明示的に文字コード変換してみる。

$hoge = mb_convert_encoding($hoge,”UTF-8”,”UTF-8”);

print_r(unpack(“C*”,$hoge));

Array ( [1] => 227 [2] => 129 [3] => 130 )

という配列が返ってくるよ。
PHPの場合。



  もとの[あ]という文字に戻すときは?



   print_r(pack("C*",227,129,130));



という風にやってやると元の[あ]という文字に

       戻すことができるよ。

※注意するのは第二引数以降は配列じゃなくって

   各バイト値を順に渡していく点。
PHPの場合。



unpack関数の引数に【H*】を与えたときは?



$hoge =“あ”;

//今回は明示的に文字コード変換してみる。

$hoge = mb_convert_encoding($hoge,”UTF-8”,”UTF-8”);

print_r(unpack(“H*”,$hoge));

Array ( [1] => e38182 )

16進数表記の3byte分の値が返ってくるよ。
PHPの場合。



同じく16進数表記の3byte値を[あ]という文字に

       戻してやりたい場合は?

     print_r(pack(“H*”, “e38182”));



という風にやってやると元の[あ]という文字に

        戻すことができるよ。
unpackやpack・・・一体何をしてるの?


  では、pack関数やunpack関数(メソッド)は

         内部で何をしているのか?

実行中の文字コードに則った符号化処理をやってるよ。

    unpack => (与えられた文字を)符号化

    pack => (与えられたバイト列を)復号化

    特に、print_r(pack(“C*”,227,129,130));

 のところなんてRFCに定義されているUnicode上の

   コードポイントを3byteの値に置き換える

           UTF-8の符号化計算を

  まるまるやってくれているのがわかるよね。
ちなみにもしUTF-8じゃなくてUTF-16でunpack/packすると?

                      Rubyだと?

                      hoge = “あ”

           hoge = hoge. encode     ("UTF-16")

             arrayObj = hoge.unpack("H*")

                    #=> ["feff3042"]



                      PHPだと?

                     $hoge = "あ";

 $hoge = mb_convert_encoding($hoge,"UTF-16","UTF-8");

              print_r(unpack("H*",$hoge));

                  Array ( [1] => 3042 )
RubyとPHPのunpackの違い。



Rubyの場合、文字エンコーディングUTF-16でunpackすると

  符号化した16進数バイト列にFEFFというBOMがつく。



対してPHPのunpackにはBOMをつけての符号化をしてくれない

           ことに注意する。



          あ?BOMってなんぞ?
BOM?


  実は、UTF-16はリトル・エンディアンというものが

         許容されている。LEね。

これは、例えば【あ】という文字をUnicodeだと【U+3042】

となるよね?でも実は【U+4230】でも【あ】とすることが

   できるんだよね。これがリトル・エンディアン。

   じゃあ本来の【U+4230】はどうなるかというと

【U+3042】というコードポイントで表現されることになる。

BOMとはこのLEかあるいは、本来の表記であるBEと呼ぶ

 ビッグエンディアンかを判断するためにファイル先頭に

         くっつける記号なんだ。
BOMつきUTF-16。



UTF-16には、通常このBOMをつけてBEかLEかを判断させる。

  通常【FEFF】というBOMが先頭に付けばBEとなり

      【FFFE】というBOMだとLEとなる。

 このLEの場合UTF-16でファイルをオープンすれば自動で

 リトルエンディアンとしてバイト列を評価してくれる。

   基本的にBEの場合はBOMを付ける必要はないが

      安全のためUTF-16で書き込む際は、

       BOMをつけるべきかもしれない。

More Related Content

What's hot

みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftTomohiro Kumagai
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)Google Developer Relations Team
 
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bashJun Nogata
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLispKent Ohashi
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]yak1ex
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
BlockSorting
BlockSortingBlockSorting
BlockSortingiuno
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
Youtube embedded
Youtube embeddedYoutube embedded
Youtube embeddedJun Chiba
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 

What's hot (20)

みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
 
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
Functional Way
Functional WayFunctional Way
Functional Way
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
BlockSorting
BlockSortingBlockSorting
BlockSorting
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
Youtube embedded
Youtube embeddedYoutube embedded
Youtube embedded
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
More C++11
More C++11More C++11
More C++11
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 

Viewers also liked

Visual resume asdar azis 2013
Visual resume asdar azis 2013Visual resume asdar azis 2013
Visual resume asdar azis 2013Asdar Azis
 
Reactive Extensions - VTD11
Reactive Extensions - VTD11Reactive Extensions - VTD11
Reactive Extensions - VTD11Pär Nordström
 
National and world heritage places
National and world heritage placesNational and world heritage places
National and world heritage placesy3ehps
 
Deepali gupta
Deepali guptaDeepali gupta
Deepali guptashubanshu
 
Chris Looney and CCS
Chris Looney and CCSChris Looney and CCS
Chris Looney and CCSloondog
 
四個啟發人性的故事
四個啟發人性的故事四個啟發人性的故事
四個啟發人性的故事chenfuwo
 
Update on US Rail Transportation
Update on US Rail TransportationUpdate on US Rail Transportation
Update on US Rail TransportationJohn Schmitter
 
香菇油菜
香菇油菜 香菇油菜
香菇油菜 Clary Xue
 
Dijital i̇ndeks-2015_v1
Dijital i̇ndeks-2015_v1Dijital i̇ndeks-2015_v1
Dijital i̇ndeks-2015_v1Mustafa Kuğu
 
Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...
Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...
Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...crbill
 
Summary paper scottseattleruf
Summary paper scottseattlerufSummary paper scottseattleruf
Summary paper scottseattlerufruralfringe
 
Mission Pistoia
Mission PistoiaMission Pistoia
Mission PistoiaAna Luis
 

Viewers also liked (20)

Visual resume asdar azis 2013
Visual resume asdar azis 2013Visual resume asdar azis 2013
Visual resume asdar azis 2013
 
Reme
RemeReme
Reme
 
Stc2011
Stc2011Stc2011
Stc2011
 
Reactive Extensions - VTD11
Reactive Extensions - VTD11Reactive Extensions - VTD11
Reactive Extensions - VTD11
 
National and world heritage places
National and world heritage placesNational and world heritage places
National and world heritage places
 
Deepali gupta
Deepali guptaDeepali gupta
Deepali gupta
 
Sistemes dimpressio
Sistemes dimpressioSistemes dimpressio
Sistemes dimpressio
 
Chris Looney and CCS
Chris Looney and CCSChris Looney and CCS
Chris Looney and CCS
 
四個啟發人性的故事
四個啟發人性的故事四個啟發人性的故事
四個啟發人性的故事
 
Motocicletas
Motocicletas Motocicletas
Motocicletas
 
Update on US Rail Transportation
Update on US Rail TransportationUpdate on US Rail Transportation
Update on US Rail Transportation
 
A129722 mision
A129722 misionA129722 mision
A129722 mision
 
香菇油菜
香菇油菜 香菇油菜
香菇油菜
 
Painter
PainterPainter
Painter
 
Analisis
AnalisisAnalisis
Analisis
 
Dijital i̇ndeks-2015_v1
Dijital i̇ndeks-2015_v1Dijital i̇ndeks-2015_v1
Dijital i̇ndeks-2015_v1
 
Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...
Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...
Hotel surf the Place Mal Pais Costa Rca boutique beach hotel vacation destina...
 
Singapore property weekly issue 2
Singapore property weekly issue 2Singapore property weekly issue 2
Singapore property weekly issue 2
 
Summary paper scottseattleruf
Summary paper scottseattlerufSummary paper scottseattleruf
Summary paper scottseattleruf
 
Mission Pistoia
Mission PistoiaMission Pistoia
Mission Pistoia
 

スクリプトで文字コード変換